2010-06-03 8 views
33

Ich habe einen Low-Brainwave-Tag ... Kennt jemand eine schnelle & elegante Möglichkeit, ein Wörterbuch zu transformieren, so dass der Schlüssel den Wert und umgekehrt?LINQ transformieren Wörterbuch <key,value> zu Wörterbuch <value,key>

Beispiel:

var originalDictionary = new Dictionary<int, string>() { 
    {1, "One"}, {2, "Two"}, {3, "Three"} 
}; 

wird

var newDictionary = new Dictionary<string, int>(); 
// contents: 
// { 
// {"One", 1}, {"Two", 2}, {"Three", 3} 
// }; 

Antwort

68

Verwenden ToDictionary?

orignalDictionary.ToDictionary(kp => kp.Value, kp => kp.Key); 

Das funktioniert, weil IDictionary<TKey,TElement>; ist auch ein IEnumerable<KeyValuePair<TKey,TElement>>;. Beachten Sie jedoch, dass bei doppelten Werten eine Ausnahme auftritt.

Wenn Sie doppelte Werte haben, müssen Sie entscheiden, was Sie damit machen wollen. Eine einfache Möglichkeit wäre, Duplikate zu ignorieren, indem zuerst Value gruppiert wird und dann das Dictionary erstellt wird.

originalDictionary 
.ToLookup(kp => kp.Value) 
.ToDictionary(g => g.Key, g => g.First().Key); 
+4

+1 Gute Möglichkeit, das doppelte Wertproblem zu behandeln. – Stephan

+0

Wenn ich Ihr Beispiel mit 'ToLookup' verwende, bekomme ich '' System.Linq.IGrouping > 'enthält keine Definition für' Value '". Ich musste 'ToDictionary' alleine in meinem Wörterbuch verwenden. –

+0

@Sarah, klingt, als ob Sie ToLookup in einer bereits gruppierten Sequenz verwenden. – driis

6

Sie sind hier:

var reversed = orignalDictionary.ToDictionary(el => el.Value, el => el.Key);

0

ich mit den Antworten zustimmen, vorausgesetzt jedoch sollten Sie prüfen, und die Änderung in Ihrem Programm machen, um tatsächlich mit dem <key, value> einrichten, anstatt diese Änderung zu machen nach.

+0

Einverstanden im Prinzip. Aber das Problem ist, dass das ursprüngliche Wörterbuch einen bestimmten Zweck erfüllt, und anstatt einen weiteren Soap-Aufruf zu machen, ist es bequemer, das zu transformieren, was ich für eine andere Bibliothek habe, die die gleichen Informationen benötigt, aber mit umgekehrtem Schlüssel/Wert. – code4life

+0

Ich sehe - gute Sachen. – VoodooChild

0

Gibt es in der Anwendung einen bestimmten Kontext, in dem Sie eine 1-zu-1-Beziehung haben oder global? Wenn Letzteres, Sie möchten ein BiDirectional Dictionary auschecken.

Verwandte Themen