2013-10-22 5 views
8

Ich möchte Schlüssel und Werte des Wörterbuchs umkehren. Ie. Aus Quellverzeichnis Dictionary<int, string>, möchte ich Dictionary<string, List<int>> bekommen. Es gibt List<int>, da der Wert mehrmals im Quellenwörterbuch unter verschiedenen Schlüsseln sein kann.Rückschlüssel und Wert im Wörterbuch

Beispiel:

{ 
    1: "A" 
    2: "A" 
    3: "A" 
    4: "B" 
    5: "B" 
    6: "C" 
    7: "D" 
} 

würde Transformation:

{ 
    "A": [1,2,3] 
    "B": [4,5] 
    "C": [6] 
    "D": [7] 
} 

Vielen Dank für Hilfe.

EDIT:

OK, mit Hilfe von euch konnte ich ein wenig über diesen Algorithmus verstehen. Jetzt sehe ich zwei mögliche Lösungen (unter anderem) und weiß nicht, was der wirkliche Unterschied zwischen ihnen ist, da das Ergebnis scheint das gleiche zu sein.

Gibt es Leistungsprobleme?

var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key) 
    .ToDictionary(group => group.Key, group => group.AsEnumerable()); 
var byGroupBy = actions.GroupBy(pair => pair.Value, pair => pair.Key) 
    .ToDictionary(group => group.Key, group => group.AsEnumerable()); 

EDIT 2:

ich landete mit nur

var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key) 

ich es nicht so einfach wäre zu erwarten hat. Danke allen.

+1

Sind Sie versuchen, eine erstellen Nachschlagen aus einem Wörterbuch? Wenn dies der Fall ist, ist die Erweiterungsmethode ToLookup() Ihr Freund. – Baldrick

+1

@B ... Ich habe versucht, es herauszufinden, aber konnte nicht den Kopf über die GroupBy-Methode mit allen Parametern und Überladungen bekommen. – sidon

+0

Nur 'var byLookup = actions.ToLookup (pair => pair.Value, pair => pair.Key)' ist genug, Sie brauchen nicht wirklich den Aufruf ToDictionary auf diesem. –

Antwort

23

Dies ist ein ziemlich einfacher LINQ Ausdruck:

var res = dict 
    .GroupBy(p => p.Value) 
    .ToDictionary(g => g.Key, g => g.Select(pp => pp.Key).ToList()); 

Zuerst Sie Gruppe durch den Wert. Dies erstellt Gruppen mit Zeichenfolgen als Schlüssel und KeyValuePair<int,string> als seine Elemente.

Dann konvertieren Sie die Gruppen in ein Wörterbuch, indem Sie den Gruppenschlüssel für den Wörterbuchschlüssel verwenden und die Schlüssel des ursprünglichen Wörterbuchs in eine Liste mit ToList() "glätten".

+0

Vielen Dank für Ihre Hilfe. Ich habe meine Frage aktualisiert, können Sie sich das bitte ansehen? – sidon

+0

@sidon Die zwei Ansätze, die Sie zeigen, sind ziemlich gleich, denn am Ende erhalten Sie sowieso ein Wörterbuch. Sie sollten 'AsEnumerable()' dort jedoch nicht verlassen, es sei denn, Sie wissen sicher, dass Sie die Listen im Wörterbuch nicht mehr als einmal aufzählen werden. – dasblinkenlight

+0

@sidon Wenn Sie ein Nachschlageobjekt anstelle eines Wörterbuchobjekts verwenden möchten, können Sie 'ToDictionary' ganz überspringen. – dasblinkenlight

3

Sie können auch Ihre gewünschte Ergebnis erhalten wie folgt:

var result = source 
    .GroupBy(x => x.Value, x => x.Key) 
    .ToDictionary(g => g.Key, g => g.ToList()); 

Dies das gleiche Ergebnis wie dasblinkenlight gibt, sondern bewegt sich die Abbildung des KeyValuePair in die Gruppe durch Klausel

Verwandte Themen