13

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

我怎样才能做到这一点?

4

6 回答 6

25
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());
于 2012-11-16T04:51:22.353 回答
4

您可以使用GroupBy

Dictionary<int,List<int>> groups = 
             prices.GroupBy(x => x.Value)
                   .ToDictionary(x => x.Key, x => x.Select(i => i.Key).ToList());
于 2012-11-16T04:48:47.743 回答
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();
}
于 2012-11-16T05:21:26.613 回答
2

您可以使用GroupBy后跟Func<TSource, TKey>, Func<TSource, TElement>重载Enumerable.ToDictionary

var d = prices.GroupBy(x => x.Value).ToDictionary(x => x.Key, x => x.ToList());
于 2012-11-16T04:51:05.687 回答
1

您可以改用查找。

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);
    }
}
于 2020-09-08T04:57:30.687 回答
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);
}
于 2015-09-29T12:24:55.523 回答