2013-04-22 146 views
0

我有对象的列表鲜明的类型

List<Animals> animals 

我试图访问动物的每个不同Typeanimals(如DogCatWalrus),并把它变成另一个泛型集合使用这种想法:

List<Type> types 
    = animals.SelectMany<Animal, Type>(a => a.GetType()).Distinct<Type>(); 

// EqualityComparer<T> is a generic implementation of IEqualityComparer<T> 
List<Type> types 
    = animals.Distinct<Animal>(new EqualityComparer<Animal>((a, b) => a.GetType() == b.GetType())); 

但我无法获得这些编译。

+0

请问您是否试图解释“这种想法”?我担心这个伪代码是不够的。 – 2013-04-22 12:32:48

回答

1

怎么样Dictionary<Type, List<Animal>>在列表中的任何列表只包含密钥类型的元素?

var typeSpecficGroups = animals.GroupBy(animal => animal.GetType()); 
var dictOfTypes = typeSpecficGroups.ToDictionary(group => group.Key, group => group.ToList()); 

现在,您可以询问字典是否有特定的动物,并获取相应的动物列表。缺点是您必须将列表中的每个元素都转换为具体的类型:

List<Animal> matchingList; 

if (dictOfTypes.TryGetValue(typeof(Dog), out matchingList)) 
{ 
    var dogs = matchingList.Cast<Dog>(); 

    foreach (var dog in dogs) 
    { 
     dog.FindBone(); 
    } 
} 
+0

+1对于不同的解决方案非常有用。 – Izzy 2013-04-22 13:05:46

4

为什么SelectMany?标准Select应该做的工作:

List<Type> types = animals.Select(x => x.GetType()).Distinct(); 
+0

它需要:'.ToList ()',但这完美的作品,谢谢。 – Izzy 2013-04-22 12:36:49