English 中文(简体)
如何在列表中添加元素数量, 使其等于 10?
原标题:How can I top up the number of elements in a list to make it equal to ten?
  • 时间:2012-05-25 05:51:57
  •  标签:
  • c#

我有市级班,里面有详细班:

public class City {

        public string PartitionKey { get; set; }
        public string RowKey { get; set; }
        public string Notes { get; set; }

        public class Detail
        {
            public Detail()
            {
                ImageFile = String.Empty;
                Explanation = new HtmlText();
            }
            public string ImageFile { get; set; }
            public HtmlText Explanation { get; set; }
        }

}

在我的代码中,我有一些线条,可以检查有多少细节,如果少于10个细节,然后我加入新的城市。详情。我正在使用下面的代码来这样做,但它位于几个不同的方法中,看起来不干净。我是否可以简化这个方法,并加上检查、计数和添加到基本城市阶级中的逻辑?

foreach (int index in Enumerable.Range(0, 10 - vm.Details.Count()))
            {
                vm.Details.Add(new City.Detail());
            }
最佳回答

正如其他人所说,使用一些东西,例如:

 while(vm.Details.Count() < 10)
      vm.Details.Add(new City.Detail());

或甚至用于建造的正常

 for(int x = vm.Details.Count(); x < 10; x++)
      vm.Details.Add(new City.Detail());

否则当其他人读了你的代码(或三个月后你再看)时, 反应会是“啊?”而不是自动识别发生的事情。

以下是解决这一问题的三种方式:

(1) (1) 只要在创建天体时在天体上添加 10 个细节, 使用这些细节, 必要时创建更多细节

(2) 如果真的没有10个细节,你为什么需要10个细节? 尽可能最好让你的物体真正代表它们所代表的东西。也许你正在试图修正什么只是更深层问题的症状。但如果不是这样的话,那么...

3) 正如其他人提到的那样,只是将这一逻辑推入你的基级。

编辑:我也应该在3号上明确指出,你需要一种方法使这个过程自动化,这样你不必用额外的细节来明确调用这个程序。我没有从你的代码中获得足够的信息来知道如何确切地告诉你这样做,但如果你想提供更多信息,说明为什么拥有10个细节很重要,那么我肯定我能帮助得更进一步。

问题回答

You could add a MinReached and a FillDetails method to your City class. The first one checks if you already reached the minimum, the second add new details up to ten.

public bool MinReached()
{
    return this.Details.Count >= 10;
}

public void FillDetails()
{
    for (int i = Details.Count; i <= 10; i++)
        this.Add(new City.Detail());
}

如果您总是需要提供 10 详细信息, 您可以在这些线上做点什么 。

Enumerable.Range(0, count).Select(i => new City.Detail()).ToList();

仅用于 10 个详细信息, 或者如果您想要添加剩余内容, 那么计算差额, 然后使用 < code > 。 Concat () 将它附加到现有列表中 。

为什么你不能使用环环

for (int i = 0; i < 10 - vm.Details.Count(); i++) vm.Details.Add(new City.Detail());

我不知道您的 cm 变量是什么类型, 但如果您想要在您的城市类中添加某种内容, 您可以在城市类中添加一个静态方法, 名为 SetDetailSize, 接受详细对象的集合, 以及您想要强制收藏的大小, 然后在您的收藏中给城市打电话。 SetDetailSize 方法通过 。

"..do this using LINQ that would eliminate the need for the for loop altogether". Surely you could do it with linq but that does not mean the looping would not take place. Use ForEach linq operator. BUt this code is similar to what you had written except its in linq style

LINQ 密码

Enumerable.Range(0, 10-vm.Details.Count()).ToList().ForEach(counter=>vm.Details.Add(new City.Detail());

编辑 编辑 编辑 编辑 编辑 编辑

这将解决您的问题 。 一旦您的班级在stansiate 中, 请默认填满 10 个城市 。 使用一个计数器检查里面有多少假元素。 一旦用户添加了细节, 便用用户输入的输入来替换假元素 。 将其放入您的底级, 然后您就可以忘记在其它位置添加更多细节 。

public class City 
{

   int counter = 0;
   public City()
   {
       //fill 10 elements by default
       Enumerable.Range(0, 10).ToList().ForEach(counter =>vm.Details.Add(new City.Detail());
   }
.
.
}

//Now define your add method as following
public void AddDetails(Details d)
{
   //remove the dummy element  
   vm.Details.RemoveAt(counter);
  //add original element and increase the counter, so next element would be added at next index
   vm.Details.insert(counter++, d);
}

另一个选项是为列表收藏创建扩展方法。 这将允许您调用在应用程序中任何地方的详细对象列表上的方法。 执行以下操作 :

public static class ExtensionMethods
{
     public static void SetDetailSize(this List<City.Detail> details, int size)
     {
          for (int i = 0; i < size - details.Count; i++) 
             details.Add(new City.Detail());    
     }
}

这样可以解决代码问题的重复问题, 因为只要您有城市列表。 详细对象, 您可以拨打以下的电话 。

vm.Details.SetDetailSize(10);

确保您有一个用于引用扩展方法类命名空间的语句。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签