Enumerable.Zip如何与LinQ一起使用

时间:2017-12-05 15:10:39

标签: c# .net linq zip

我想Zip多个整数列表,不知道如何在LinQ中做到这一点。

这是我的清单:

List<KeyValuePair<Guid, List<int>>> totals = Totals.Where(x => x.Key == myGuid).ToList();
//where Totals is a List<KeyValuePair<Guid, List<int>>>

List<List<int>> totalsValue = totals.Select(s => s.Value).ToList();
//I want to Zip all my List<int> in totalsValue and put it into listToReturn


List<int> listToReturn = new List<int>();

我想要这样的东西:http://linqsamples.com/linq-to-objects/other/Zip-lambda-csharp但是在这个例子中,列表是分开的。 我的列表是&gt; 其中listToReturn表示要返回的列表。

有人可以帮助我吗?

结果: adventest也是List和agiltest enter image description here

1 个答案:

答案 0 :(得分:0)

我认为您正在寻找SelectMany

List<int> listToReturn= totals = Totals.Where(x => x.Key == myGuid)
                                       .SelectMany(s => s.Value)
                                       .ToList();

您要做的是将所有列表展平为一个序列,这就是SelectMany扩展方法的作用。另一方面,Zip将第一个序列的每个元素与第二个序列中具有相同索引的元素合并,换句话说,它允许您从两个相同长度的序列进行投影。

更新

现在我明白你想要实现的目标:

var lists= Totals.Where(x => x.Key == myGuid).Select(e=>Value).ToList();// Select the lists
if(lists.Count>0)
  var result=  Enumerable.Range(0, lists[0].Count).Select(i=> lists.Sum(l=>l[i]));

使用此解决方案,您需要确保所有选定列表具有相同的大小。我非常确定有一个更优雅的解决方案,但现在我想起来了。如果我想更好的东西,我会更新我的答案