繁体   English   中英

如何转换清单 <Tuple<int, int> &gt;到字典 <int, List<int> &gt;?

[英]How to convert List<Tuple<int, int>> to Dictionary<int, List<int>>?

我有具有不同值的重复键,我想将其转换为具有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>>();

将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 });
    }
}
var list = tup.GroupBy(x => x.Item1)
              .ToDictionary(
                    x => x.Key, 
                    x => x.Select(y => y.Item2).ToList());

首先,我们将GroupBy项目1分组。这应该很明显。

然后,我们调用ToDictionary并传入keySelectorelementSelector 给定一个IGrouping<int, Tuple<int, int>>它们分别选择键和值。

作为参考, 使用了ToDictionary此特定重载

另外,正如铱公司在评论中所说,这同样有效:

var list = tup.GroupBy(x => x.Item1, x => x.Item2)
              .ToDictionary(x => x.Key, x => x.ToList());

GroupBy这种重载使您可以选择2件事!

首先,您需要对第一个元组元素进行分组,以查找字典中具有相同键的所有元素。 然后只收集第二个元组元素并从中列出一个列表:

tup.GroupBy(t => t.Item1)
   .ToDictionary(g => g.Key, g => g.Select(t => t.Item2).ToList());

您可以使用GroupBy解决此问题,例如:

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 = tup
         .GroupBy(x => x.Item1)
         .ToDictionary(x => x.Key, tuples => tuples.Select(x => x.Item2).ToList());

顺便说一句,在某些情况下,您可以使用NameValueCollection ,但这不会保存您的目标类型,例如

var nvc = tup.Aggregate(new NameValueCollection(),
  (seed, current) =>
  {
    seed.Add(current.Item1.ToString(), current.Item2.ToString());
    return seed;
  });

foreach (var item in nvc)
{
  Console.WriteLine($"Key = {item} Value = {nvc[item.ToString()]}");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM