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 に答える