我有一个“复杂”类型的列表 - 一个具有一些字符串属性的对象。 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泛型,而且特性类是外部依赖 - 我不能改变它的结构来简化它,并且有该课程的其他方面很重要,只是与这个问题无关。
欢迎任何指示或额外阅读。
答案 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");