2012-11-16 19 views
6

Ich habe ein Wörterbuch: Dictionary<int,int>. Ich möchte ein neues Wörterbuch bekommen, in dem die Schlüssel des ursprünglichen Wörterbuchs List<int> darstellen. Das ist, was ich meine:"Gruppierung" Wörterbuch nach Wert

var prices = new Dictionary<int,int>(); 

Die prices folgende Daten enthalten:

1 100 
2 200 
3 100 
4 300 

Ich möchte die IList<Dictionary<int,List<int>>> bekommen:

int  List<int> 
100  1,3 
200  2 
300  4 

Wie kann ich das tun?

Antwort

14
var prices = new Dictionary<int, int>(); 
prices.Add(1, 100); 
prices.Add(2, 200); 
prices.Add(3, 100); 
prices.Add(4, 300); 

Dictionary<int,List<int>> test = 
        prices.GroupBy(r=> r.Value) 
        .ToDictionary(t=> t.Key, t=> t.Select(r=> r.Key).ToList()); 
+0

Danke, aber , Werte enthält alle Objekt, ich will nur Schlüssel aus dem ursprünglichen Wörterbuch – user1260827

+0

@ user1260827, sorry verpasste eine Sache, können Sie die Abfrage jetzt versuchen. Ich habe es gerade in VS und seiner Arbeit versucht – Habib

+0

Danke. Das ist das, was ich benötige. – user1260827

2

Sie können GroupBy verwenden.

Dictionary<int,List<int>> groups = 
      prices.GroupBy(x => x.Value) 
        .ToDictionary(x => x.Key, x => x.Select(i => i.Key).ToList()); 
2

Hier meine Antwort ist. Wenn die Wörterbücher umfangreich werden, werden Sie wahrscheinlich die Erweiterungsmethoden GroupBy() weniger effizient finden, als Sie möchten, da sie viele Garantien bieten, die Sie nicht benötigen, wie beispielsweise die Beibehaltung der Reihenfolge.

public static class DictionaryExtensions 
{ 
    public static IDictionary<TValue,List<TKey>> Reverse<TKey,TValue>(this IDictionary<TKey,TValue> src) 
    { 
     var result = new Dictionary<TValue,List<TKey>>(); 

     foreach (var pair in src) 
     { 
      List<TKey> keyList; 

      if (!result.TryGetValue(pair.Value, out keyList)) 
      { 
       keyList = new List<TKey>(); 
       result[pair.Value] = keyList; 
      } 

      keyList.Add(pair.Key); 
     } 

     return result; 
    } 
} 

Und ein Beispiel in LinqPad verwenden:

void Main() 
{ 
    var prices = new Dictionary<int, int>(); 
    prices.Add(1, 100); 
    prices.Add(2, 200); 
    prices.Add(3, 100); 
    prices.Add(4, 300); 

    // Dump method is provided by LinqPad. 
    prices.Reverse().Dump(); 
} 
0

Insbesondere Fall, wenn wir den Rahmen .NET 2.0 verwenden, was wir tun können, wie folgt:

var prices = new Dictionary<int, int>(); 
prices.Add(1, 100); 
prices.Add(2, 200); 
prices.Add(3, 100); 
prices.Add(4, 300); 

Dictionary<int, List<int>> grouping = new Dictionary<int, List<int>>(); 

var enumerator = prices.GetEnumerator(); 
while (enumerator.MoveNext()) 
{ 
    var pair = enumerator.Current; 
    if (!grouping.ContainsKey(pair.Value)) 
     grouping[pair.Value] = new List<int>(); 
    grouping[pair.Value].Add(pair.Key); 
} 
Verwandte Themen