2013-04-22 104 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