0

我有一个 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。我正在使用下面的代码来执行此操作,但它位于几种不同的方法中,看起来并不干净。有什么方法可以简化这一点,并将检查、计数和添加的逻辑添加到我的基本 City 类中?

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

7 回答 7

2

您可以将 MinReached 和 FillDetails 方法添加到您的 City 类。第一个检查您是否已经达到最小值,第二个添加新的详细信息最多十个。

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

public void FillDetails()
{
    for (int i = Details.Count; i <= 10; i++)
        this.Add(new City.Detail());
}
于 2012-05-25T06:01:22.967 回答
2

如果您总是需要提供 10 个详细信息,可以在这些行上做一些事情

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

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

于 2012-05-25T06:04:18.797 回答
1

为什么不能使用 for 循环

for (int i = 0; i < 10 - vm.Details.Count(); i++) vm.Details.Add(new City.Detail());
于 2012-05-25T05:58:45.850 回答
1

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

于 2012-05-25T06:02:00.467 回答
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)只需在创建 City 对象时添加十个详细信息,使用它们,然后在必要时创建更多

2) 如果真的没有 10 个细节,为什么还需要 10 个细节?尽可能让您的对象真正代表它们所代表的内容。因此,也许您正在尝试解决更深层次问题的症状。但如果不是这样的话,那么……

3)正如其他人所提到的,只需将此逻辑移动到您的基类中。

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

于 2012-05-25T06:10:45.847 回答
0

“..使用 LINQ 执行此操作,这将完全消除对 for 循环的需要”。当然你可以用 linq 来做,但这并不意味着循环不会发生。使用 ForEach linq 运算符。但是这段代码与你写的类似,除了它是 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);
}
于 2012-05-25T06:05:48.217 回答
0

另一种选择是为 List 集合创建扩展方法。这将允许您从应用程序中的任何位置调用 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 语句。

于 2012-05-25T14:06:55.840 回答