2013-10-25 8 views
6

Ich habe eine Sammlung von verschiedenen Objekten und möchte wissen, ob ich Sammlungen erstellen kann, die denselben Typ von Objekten gruppieren. Ich weiß nicht, ob es eine Methode mit linq oder etwas in der Art gibt.Gruppieren von Sammlungen des gleichen Typs 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); 

Ich möchte neue Listen der gleichen Art:

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

Antwort

15

LINQ dies sehr leicht tun können, eine einzige lookup Sammlung Rückkehr:

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

Sie können dann:

  • Iterate darüber, um alle th zu finden Die Typen und die zugehörigen Objekte
  • Mit dem Indexer alle Elemente eines bestimmten Typs abrufen. Wenn Sie einen Typ angeben, der in der Suche nicht vorhanden ist, wird eine leere Sequenz zurückgegeben (was wirklich nützlich ist, anstatt eine Ausnahme auszulösen oder null zurückzugeben).
4

Sie Enumerable.OfType

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

von Jon Skeet in einer der Kommentare Wie erwähnt können, über Probleme hat, wenn es Vererbung in Bild (dh Object1 leitet Object2 bilden). Wenn das der Fall ist, nur Option ist mit

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

'='! = '==' Ihre Gleichheitsoperatoren sind nicht richtig. –

+0

@ Jeremy, Typo korrigiert, danke, dass du es aufgezeigt hast. – Tilak

4

Sure Typ vergleichen -

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

Werden Sie nach Typ eine Sammlung von Sammlungen Gruppe geben.

2

Sie mögen dies bedeuten:

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

?

+0

Beachten Sie, dass, wenn (sagen wir) 'Objekt3' von' Objekt1' abgeleitet wird, dies nicht die erforderliche Anzahl ergibt. –

+0

@JonSkeet gewährt; man könnte den Typ explizit nachschlagen und mit typeof (Object1) vergleichen, wenn das der Fall wäre. Wie auch immer, Linq ist der richtige Weg. –

Verwandte Themen