1

我有一个“复杂”类型的列表 - 一个具有一些字符串属性的对象。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 泛型,并且 Characteristic 类是一个外部依赖项 - 我无法更改它的结构来简化它,还有其他方面重要的类,只是与这个问题无关。

欢迎任何指示或补充阅读。

4

3 回答 3

1

我会手动做一些工作。通过先执行 FindAll,然后执行 Convert,您将在集合中循环两次。似乎没有必要。如果您最终想要的只是一个 CharacteristicValue 列表,那么只需遍历您的原始集合,并将 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);
        }
     }
于 2009-01-26T21:03:07.903 回答
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);
于 2009-01-26T22:58:33.210 回答
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");
于 2009-01-26T20:28:13.310 回答