按值“分组”字典

我有一个字典: Dictionary 。 我想得到一个新的字典,其中原始字典的键表示为List 。 这就是我的意思:

 var prices = new Dictionary(); 

prices包含以下数据:

 1 100 2 200 3 100 4 300 

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

 int List 100 1,3 200 2 300 4 

我怎样才能做到这一点?

 var prices = new Dictionary(); prices.Add(1, 100); prices.Add(2, 200); prices.Add(3, 100); prices.Add(4, 300); Dictionary> test = prices.GroupBy(r=> r.Value) .ToDictionary(t=> t.Key, t=> t.Select(r=> r.Key).ToList()); 

这是我的回复。 当字典变大时,您可能会发现GroupBy()扩展方法的效率低于您的预期,因为它们提供了许多您不需要的保证,例如保留顺序。

 public static class DictionaryExtensions { public static IDictionary> Reverse(this IDictionary src) { var result = new Dictionary>(); foreach (var pair in src) { List keyList; if (!result.TryGetValue(pair.Value, out keyList)) { keyList = new List(); result[pair.Value] = keyList; } keyList.Add(pair.Key); } return result; } } 

以及在LinqPad中使用的示例:

 void Main() { var prices = new Dictionary(); 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(); } 

您可以使用GroupBy 。

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

您可以使用GroupBy然后使用Enumerable.ToDictionaryFunc, Func重载 :

 var d = prices.GroupBy(x => x.Value).ToDictionary(x => x.Key, x => x.ToList()); 

在特殊情况下,当我们使用.NET framework 2.0时,我们可以执行以下操作:

 var prices = new Dictionary(); prices.Add(1, 100); prices.Add(2, 200); prices.Add(3, 100); prices.Add(4, 300); Dictionary> grouping = new Dictionary>(); var enumerator = prices.GetEnumerator(); while (enumerator.MoveNext()) { var pair = enumerator.Current; if (!grouping.ContainsKey(pair.Value)) grouping[pair.Value] = new List(); grouping[pair.Value].Add(pair.Key); }