按值“分组”字典

时间:2012-11-16 04:45:05

标签: c# .net linq dictionary grouping

我有一本字典: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

我该怎么做?

6 个答案:

答案 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);
}
相关问题