2012-11-16 51 views
6

我有一本字典:Dictionary<int,int>。我想獲得新字典,其中原始字典的鍵表示爲List<int>。這就是我的意思是:「按分組」字典

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

prices包含以下數據:

1 100 
2 200 
3 100 
4 300 

我想要得到的IList<Dictionary<int,List<int>>>

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

我怎樣才能做到這一點?

回答

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

謝謝,但,值包含所有對象,我只想從原始字典中的鍵 – user1260827

+0

@ user1260827,抱歉錯過了一件事,現在可以嘗試查詢。我剛剛在VS和它的工作中嘗試過它 – Habib

+0

謝謝。這是我需要的。 – user1260827

2

您可以使用GroupBy

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

這裏是我的回答。當字典變大時,您可能會發現GroupBy()擴展方法的效率比您想要的要低,因爲它們提供了許多您不需要的保證,例如保留順序。

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; 
    } 
} 

而且在LinqPad使用一個例子:

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

在特殊情況下,當我們使用.NET Framework 2.0中,我們可以做如下:

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); 
}