2012-11-16 13 views
6

Ho un dizionario: Dictionary<int,int>. Voglio ottenere un nuovo dizionario dove le chiavi del dizionario originale rappresentano come List<int>. Questo è quello che voglio dire:Dizionario "Raggruppamento" per valore

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

Il prices contenere i seguenti dati:

1 100 
2 200 
3 100 
4 300 

voglio ottenere il IList<Dictionary<int,List<int>>>:

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

Come posso fare questo?

risposta

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

Grazie, ma , i valori contengono tutti gli oggetti, voglio solo le chiavi dal dizionario originale – user1260827

+0

@ user1260827, mi dispiace perdere una cosa, puoi provare ora la query. Ho appena provato in VS e il suo funzionamento – Habib

+0

Grazie. Questo è quello di cui ho bisogno. – user1260827

2

È possibile utilizzare GroupBy.

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

Ecco la mia risposta. Quando i dizionari diventano grandi, è probabile che i metodi di estensione GroupBy() risultino meno efficienti di quanto si desideri, poiché offrono molte garanzie che non sono necessarie, ad esempio l'ordine di conservazione.

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

e un esempio da utilizzare in 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

Nel caso in particolare, quando si usa il framework .NET 2.0, possiamo fare come segue:

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