2012-04-03 15 views
3

Ich habe eine Liste von Objekten in C#. Alle Objekte enthalten die Eigenschaften code1 und code2 (neben anderen Eigenschaften).Objekte gruppieren mit übereinstimmenden Eigenschaften in Listen

Beispiel:

List -> object = id, name, code1, code2, hours, amount. 

Es gibt 31 mögliche code1 Werte. Es gibt 10 mögliche Code2-Werte.

ich zu einer Gruppe muß zusammen alle Objekte die gleichen code1 und code2 Werte (die einzigartige Kombination) in ihre eigenen Listen, die innerhalb einer übergeordneten Liste gespeichert werden würden (so dass jede einzelne Liste später iteriert werden kann.)

+0

Haben Sie versucht, Ihre Liste mit LINQ zu filtern? Es erleichtert die Filterung von Listen mit der Sql Query-Syntax. – phadaphunk

Antwort

9

Klingt wie Sie wollen etwas, wie:

var groups = list.GroupBy(x => new { x.code1, x.code2 }); 

// Example of iterating... 
foreach (var group in groups) 
{ 
    Console.WriteLine("{0}/{1}:", group.Key.code1, group.Key.code2); 
    foreach (var item in group) 
    { 
     Console.WriteLine(" {0} ({1})", item.id, item.name); 
    } 
} 
+0

Genau das habe ich gebraucht. Danke für die Lösung und Beispiel-Iteration. – Baxter

+0

Würde es funktionieren, als ob ich es auf neues Objekt werfen würde => list.GroupedBy (x => neues TempObject {x.code1, x.code2}); – cpoDesign

4

Enumerable Erweiterungen ist dein Freund (sind * Ihre Freunde :)

var groups = lists.GroupBy(item => new { item.code1, item.code2 }); 

Und .... die l? Egendey Skeet Hit Post vor mir, die Schande!

Zeit bis eins Skeet (ha, rechts). Sie können auch Ihre allgemeinen Elemente in einem Wörterbuch gruppieren.

var mapping = list 
    .GroupBy(item => new { item.code1, item.code2 }) 
    .ToDictionary(g => g.Key, g => g.ToList()); 

Jetzt ist das Mapping ein Dictionary<anon{code1, code2}, List<YourObject>>. Natürlich könnten Sie die ToList für den Wert weglassen, und der Werttyp des Dictionary wäre eine IGrouping, was ein IEnumerable ist.

Sie könnten auch ToLookup

var lookup = list.ToLookup(item => new { item.code1, item.code2 }); 

Das Ergebnis ist ein ILookup verwenden, die einen Schlüssel des Schlüsseltyp hat gegeben, und ist ein IEnumerable der Listentyp verwendet. Es ist kein Wörterbuch, kann aber ähnlich verwendet werden.

+2

Es wäre einfacher zu verwenden 'list.ToLookup (x => new {item.code1, item.code2})' :) –

+1

Danke, dass du mir einen hilfst ... :) – payo

Verwandte Themen