2012-11-16 15 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); 
} 
関連する問題