链接通用列表扩展的方法

时间:2009-01-26 20:16:30

标签: c# generics .net-2.0 findall convertall

我有一个“复杂”类型的列表 - 一个具有一些字符串属性的对象。 List本身是另一个对象的属性,包含各种类型的对象,如此缩写类结构所示:

Customer {
   public List<Characteristic> Characteristics;
   .
   .
   .
}

Characteristic {
   public string CharacteristicType;
   public string CharacteristicValue;
}

我希望能够为当前客户收集特定类型的特征值的列表,我可以按照以下两个步骤进行:

List<Characteristic> interestCharacteristics = customer.Characteristics.FindAll(
   delegate (Characteristic interest) {
      return interest.CharacteristicType == "Interest";
   }
);

List<string> interests = interestCharacteristics.ConvertAll<string>(
   delegate (Characteristic interest) {
      return interest.CharacteristicValue;
   }
);

这很好,但似乎还有很长的路要走。我确定我必须错过一个更简单的方法来获取这个列表,或者将FindAll()和Convert()方法链接在一起,或者我完全忽略的其他东西。

对于后台,我在.Net 2.0工作,所以我只限于.Net 2泛型,而且特性类是外部依赖 - 我不能改变它的结构来简化它,并且有该课程的其他方面很重要,只是与这个问题无关。

欢迎任何指示或额外阅读。

3 个答案:

答案 0 :(得分:1)

我会手工完成一些工作。通过首先执行FindAll,然后执行转换,您将循环遍历集合两次。它似乎没有必要。如果你想在一天结束时,只需要一个CharacterValue列表,那么只需遍历原始集合,然后将CharacteristicValue添加到符合条件的每个列表中。像这样:

     Predicate<Characteristic> criteria = delegate (Characteristic interest) 
     {
          return interest.CharacteristicType == "Interest";
     };
     List<string> myList = new List<string>();
     foreach(Characteristic c in customer.Characteristics)
     {
        if(criteria(c))
        {
            myList.Add(c.CharacteristicValue);
        }
     }

答案 1 :(得分:1)

这是一个生成器实现

public static IEnumerable<string> GetInterests(Customer customer)
{
    foreach (Characteristic c in customer.Characteristics)
    {
        if (c.CharacteristicType == "Interest")
            yield return c.CharacteristicValue;
    }
}

遗憾的是,3.5扩展方法和lambda都是根据您的要求提出的,但这里有参考:

customer.Characteristics
    .Where(c => c.CharacteristicType == "Interest")
    .Select(c => c. CharacteristicValue);

答案 2 :(得分:0)

为什么不创建Dictionary<string, List<string>>,这样您可以添加“兴趣”作为键,并将值列表作为值。例如:

Customer {
   public Dictionary<string, List<string>> Characteristics;
   .
   .
   .
}

...

Characteristics.Add("Interest", new List<string>());
Characteristics["Interest"].Add("Post questions on StackOverflow");
Characteristics["Interest"].Add("Answer questions on StackOverflow");
..

List<Characteristic> interestCharacteristics = Characteristics["Interest"];

此外,如果您愿意,可以将您的特征限制为可能值列表,方法是将其作为枚举,然后将其用作词典键的数据类型:

public enum CharacteristicType
{
   Interest,
   Job,
   ThingsYouHate
//...etc
}

然后将您的字典声明为:

public Dictionary<CharacteristicType, List<string>> Characteristics;
..
Characteristics.Add(CharacteristicType.Interest, new List<string>());
Characteristics[CharacteristicType.Interest].Add("Post questions on StackOverflow");
Characteristics[CharacteristicType.Interest].Add("Answer questions on StackOverflow");