如何填充列表中的元素数量使其等于10?

时间:2012-05-25 05:51:58

标签: c#

我有一个City类,里面有一个Detail类:

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; }
        }

}

在我的代码中,我有一些行检查有多少细节,如果少于十,那么我添加新的City.Details。我使用下面的代码来做这个,但它位于几个不同的方法,看起来不干净。有没有什么方法可以简化这个,并添加检查,计数和添加到我的基础城市类的逻辑?

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

7 个答案:

答案 0 :(得分:2)

您可以在City类中添加MinReached和FillDetails方法。 第一个检查您是否已达到最小值,第二个添加新细节最多十个。

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

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

答案 1 :(得分:1)

为什么不能用于循环

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

答案 2 :(得分:1)

我不确定你的cm变量是什么类型但是如果你想在你的City类中添加一些东西你可以向City类添加一个静态方法,其名称类似于SetDetailSize,它接受一组Detail对象和一个大小你想要强制收集,然后只需调用传入集合的City.SetDetailSize方法。

答案 3 :(得分:1)

如果你总是需要提供10个细节,可以在这些方面做点什么

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

这仅适用于10个详细信息,或者如果您想要添加余数,请计算差异,然后使用.Concat()将其附加到现有列表中。

答案 4 :(得分:1)

正如其他人所说,使用类似下面的内容

 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());

否则,当其他人阅读你的代码时(或者从现在开始3个月后你会看到它),反应将是“嗯?”而不只是自动识别正在发生的事情。

以下是解决问题的三种方法:

1)只需在创建城市对象时向城市对象添加10个细节,然后使用这些细节,然后在必要时创建更多

2)如果没有10个细节,为什么还需要10个细节?尽可能让你的对象真正代表它们代表的东西。所以,也许你正试图解决只是一个更深层次问题的症状。但如果情况并非如此,那么......

3)正如其他人所提到的那样,只需将此逻辑移入基类。

编辑:我应该在#3上明确表示你需要一种方法来自动完成这个过程,所以你不必显式调用用额外的细节来填充它的过程。我的代码中没有足够的信息知道如何告诉你这样做但是如果你想提供更多信息,为什么有10个详细信息很重要,那么我相信我可以帮助你进一步。

答案 5 :(得分:0)

“..使用LINQ完成此操作,完全不需要for循环”。 当然你可以用linq来做,但这并不意味着不会发生循环。使用ForEach linq运算符。 BUt这段代码类似于你所写的内容,除了它的linq样式

LINQ代码

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

修改

认为这可以解决您的问题。您的班级一旦实现,默认情况下填写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);
}

答案 6 :(得分:0)

另一种选择是为List集合创建扩展方法。这将允许您从应用程序中的任何位置调用List of Detail对象上的方法。执行以下操作:

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());    
     }
}

这解决了代码重复问题,因为只要你有一个City.Detail对象列表,你就可以进行以下调用。

vm.Details.SetDetailSize(10);

确保您有一个引用ExtensionMethods类的命名空间的using语句。