我有一本字典: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
我该怎么做?
答案 0 :(得分:19)
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());
答案 1 :(得分:3)
您可以使用GroupBy。
Dictionary<int,List<int>> groups =
prices.GroupBy(x => x.Value)
.ToDictionary(x => x.Key, x => x.Select(i => i.Key).ToList());
答案 2 :(得分:3)
这是我的回复。当字典变大时,您可能会发现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();
}
答案 3 :(得分:1)
您可以使用GroupBy
后跟the Func<TSource, TKey>, Func<TSource, TElement>
overload of Enumerable.ToDictionary
:
var d = prices.GroupBy(x => x.Value).ToDictionary(x => x.Key, x => x.ToList());
答案 4 :(得分:1)
知道,这是一个古老的问题,但是为正在搜索我的人发布了答案。您可以改用Lookup。
var prices = new Dictionary<int, int> { {1, 100}, { 2, 200 }, { 3, 100 }, { 4, 300 } };
ILookup<int, int> groups = prices.ToLookup(x => x.Value, y => y.Key);
foreach (var group in groups)
{
foreach (var item in group)
{
Console.WriteLine(item);
}
}
答案 5 :(得分: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);
}