按值“分组”字典
我有一个字典: 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.ToDictionary
的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); }