如何将List <Tuple <int,int >>转换为Dictionary <int,List <int >>?

Mis*_*sky 1 c# linq

我有重复的键具有不同的值,我想将其转换为具有1个键及其值的字典.

下一个例子将最好地解释我的意思:

var tup = new List<Tuple<int, int>>();
tup.Add(new Tuple<int, int>(1, 1));
tup.Add(new Tuple<int, int>(1, 2));

var dic = new Dictionary<int, List<int>>();
Run Code Online (Sandbox Code Playgroud)

什么是将tup转换为dic的优雅方式?

我设法做到这一点,foreach但想在LINQ写它.

foreach (var item in tup)
{
    if (dic.ContainsKey(item.Item1))
    {
        dic[item.Item1].Add(item.Item2);
    }
    else
    {
        dic.Add(item.Item1, new List<int> { item.Item2 });
    }
}
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 5

var list = tup.GroupBy(x => x.Item1)
              .ToDictionary(
                    x => x.Key, 
                    x => x.Select(y => y.Item2).ToList());
Run Code Online (Sandbox Code Playgroud)

首先,我们按GroupBy项目1 分组.这应该是足够明显的.

然后,我们打电话ToDictionary并传入a keySelector和a elementSelector.他们分别选择键和值,给出一个IGrouping<int, Tuple<int, int>>.

作为参考,这种特殊的过载ToDictionary,使用.

另外,正如Iridium在评论中所说,这也有效:

var list = tup.GroupBy(x => x.Item1, x => x.Item2)
              .ToDictionary(x => x.Key, x => x.ToList());
Run Code Online (Sandbox Code Playgroud)

这个超载GroupBy允许你选择2件事!

  • 您可以通过使用指定"元素选择器"的另一个`GroupBy`重载来缩短这一点,允许删除`Select`:`tup.GroupBy(x => x.Item1,x => x.Item2) .ToDictionary(x => x.Key,x => x.ToList());` (2认同)