2012-05-10 18 views
6

Ich habe ein bekam List<MyClass>:C# erweitern Wohnung Liste <T> auf Dictionary <T, ICollection <int>>

public int MyClass 
{ 
    public int One { get; set; } 
    public int Two { get; set; } 
} 

, nun die Daten können (und nicht) wie folgt aussehen:

One : 1, zwei: 9

One: 2, zwei: 9

One: 1, zwei: 8

0.123.

One: 3, Two: 7

Sehen Sie, wie "One" zweimal erscheint? Ich mag diese flache Sequenz in einen gruppierten Dictionary<int,ICollection<int>> projizieren:

KeyValuePairOne: {Key: 1, Wert: {9, 8}}

KeyValuePairTwo: {Schlüssel: 2, Wert: {9}}

KeyValuePairThree: {Key: 3, Wert: {7}}

ich vermute, ich brauche eine Kombination von .GroupBy und .ToDictionary zu tun?

+0

Sie sind in einer guten Richtung. Was hast du probiert? – SimpleVar

+1

yep genau das, was ich tun würde –

+0

@Yorye - ich habe eine hässliche Schleife versucht, und ich wusste, es war nicht der richtige Weg, es zu tun, aber wusste nicht, wie man '.GroupBy' und'. ToDictionary "zusammen hier, also kam ich auf den Stapel und bat um Hilfe. :) – RPM1984

Antwort

2
var list = new List<MyClass>(); 

var dictionary = list.GroupBy(x => x.One) 
        .ToDictionary(x => x.Key, x => x.ToArray()); 
+0

richtig, aber es ist eigentlich 'x => x.Wählen (y => y.Two). ToArray()' in der '.ToDictionary> ', weil ich mit einem' Dictionary > 'nicht' Wörterbuch > ' – RPM1984

+0

Mein schlechtes. Aber solange du die Lösung hast, bin ich glücklich. – SimpleVar

+0

also bin ich. :) danke und akzeptiert. – RPM1984

4

Dies ist, was ToLookup Erweiterungsmethode ist. Wo ToDictionary den Schlüssel zweimal ausgibt, ist ToLookup stattdessen in Ordnung und macht das, wonach Sie suchen.

+0

ToLookup ist so ähnlich wie GroupBy, was allein als Lösung für die Frage nicht ausreicht (macht das Dictionary daraus) – SimpleVar

+0

@YoryeNathan es ist prägnanter als GroupBy: ein Satz statt zwei. Außerdem ist deine Antwort * genau das * - um eine GroupBy zu machen - so offensichtlich denkst du, dass es ausreicht (oder zumindest die beste Lösung ist). – McGarnagle

+0

GroupBy ist korrekt, aber mit Hinzufügung von ToDictionary. ToLookup mit Hinzufügung von ToDictionary funktioniert auch. Was übrigens nicht kürzer ist. Ich sage nur, dass Sie ToDictionary immer noch benötigen, da das OP ein Wörterbuch wollte. – SimpleVar

0

das genau ist, wie Sie es tun würden:

Dictionary<int, List<MyClass>> result = 
    items.GroupBy(x => x.One).ToDictionary(x => x.Key, x => x.ToList()); 
+0

ahhh, das ist es ... (glaube ich) .. versuche jetzt ... – RPM1984

+2

Warum nicht var verwenden? Außerdem wird .ToArray() auch ICollection erstellen und ist effizienter. Sie sollten nur dann eine Liste erstellen, wenn Sie die Option Hinzufügen/Entfernen auf der ICollection verwenden möchten. – SimpleVar

+0

wahr und wahr .. – RPM1984

Verwandte Themen