2012-11-16 20 views
6

Ben bir sözlüğe sahibim: Dictionary<int,int>. Orijinal sözlüğün anahtarlarının List<int> olarak temsil edildiği yeni sözlük almak istiyorum. Bu ne demek olduğunu:"Grouping" sözlüğüne göre hesap

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

prices aşağıdaki verileri içerir:

1 100 
2 200 
3 100 
4 300 

Almak istediğim IList<Dictionary<int,List<int>>>:

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

Bunu nasıl yapabilirim?

cevap

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

Teşekkür ancak , değerler tüm nesneyi içerir, sadece orijinal sözlükten – user1260827

+0

@ user1260827 anahtarlarını istiyorum, üzgünüm bir şey kaçırdı, şimdi sorguyu deneyebilirsiniz. Ben sadece VS ve onun çalışma – Habib

+0

teşekkürler denedim. İhtiyacım olan bu. – user1260827

2

GroupBy'u kullanabilirsiniz.

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

İşte benim cevap. Sözlükler büyüdükçe, isteme emri gibi ihtiyaç duymadığınız birçok garantiyi sağladıklarından GroupBy() uzantısı yöntemlerini istediğinizden daha az verimli bulabilirsiniz.

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

Ve LINQPad kullanmak üzere bir örnek: özel durumda

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

, biz NET framework 2.0 kullandığınızda, yapabileceğimiz şöyle:

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