2013-10-25 11 views
6

Mam kolekcję różnych obiektów i chcę wiedzieć, czy mogę tworzyć kolekcje grupujące obiekty tego samego typu. Nie wiem, czy istnieje metoda z linq lub coś podobnego.Grupowanie kolekcji tego samego typu C#

List<Object> list = new List<Object>(); 
Object1 obj1 = new Object1(); 
Object2 obj2 = new Object2(); 
Object1 obj3 = new Object1(); 
Object3 obj4 = new Object3(); 
Object3 obj5 = new Object3(); 

list.Add(obj1); 
list.Add(obj2); 
list.Add(obj3); 
list.Add(obj4); 
list.Add(obj5); 

chcę nowe listy tego samego typu:

List<Object1> newList1 = method.GetAllObjectsFromListObject1 // Count = 2 
List<Object2> newList2 = //GetAllObjectsFromListObject2 // Count = 1 
List<Object3> newList3 = //GetAllObjectsFromListObject3 // Count = 2 

Odpowiedz

15

LINQ można to zrobić bardzo łatwo powrocie pojedynczy lookup kolekcję:

var lookup = list.ToLookup(x => x.GetType()); 

Następnie można:

  • Iteruj nad nim, aby znaleźć wszystkie e typy i powiązane obiekty
  • Pobierz wszystkie elementy określonego typu za pomocą indeksu. Jeśli określisz typ, który nie jest obecny w odnośniku, zwróci on pustą sekwencję (która jest naprawdę przydatna, zamiast rzucać wyjątek lub zwracać wartość null).
4

Można użyć Enumerable.OfType

var newList1 = list.OfType<Object1>().ToList() 
var newList2 = list.OfType<Object2>().ToList() 
var newList3 = list.OfType<Object3>().ToList() 

Jak wspomniano Jon Skeet w jednym z komentarzy, powyżej ma problemy, gdy nie ma dziedziczenia w obrazie (tj Object1 wywodzi tworzą object2). Jeśli tak jest, to jedyną opcją jest porównanie stosowania typu

var newList1 = list.Where(t=>t.GetType() == typeof(Object1)).ToList() 
var newList2 = list.Where(t=>t.GetType() == typeof(Object2)).ToList() 
var newList3 = list.Where(t=>t.GetType() == typeof(Object3)).ToList() 
+0

'='! = '==' operatorzy równości nie mają racji. –

+0

@Jeremy, poprawił Typo, dzięki za wskazanie. – Tilak

4

pewne -

list.GroupBy(t => t.GetType()); 

daje zbiór grupy kolekcje typu.

2

Masz na myśli tak:

var newList1 = list.OfType<Object1>().ToList(); 

?

+0

Zauważ, że jeśli (powiedzmy) 'Object3' pochodzi z' Object1', to nie dałoby to wymaganej liczby. –

+0

@JonSkeet granted; można jednoznacznie wyszukać typ i porównać do 'typeof (Object1)' jeśli tak było. Tak czy inaczej, Linq jest drogą do zrobienia. –