我有两个IEnumberable<double>
列表。
如何使用Linq将一个列表的每个值添加到另一个列表中相同位置的值?
答案 0 :(得分:6)
您可以使用Enumerable.Zip执行此操作:
var results = first.Zip(second, (f,s) => f+s);
请注意,如果列表长度不同,则结果将是两个列表中较短者的长度(Zip
如上所述将元素加在一起,直到一个序列结束,然后停止。 ..)
答案 1 :(得分:4)
假设两者长度相同,您可以使用Zip而不会丢失任何内容。如果它们的长度不同,则最短列表长度将是结果长度。
first.Zip(second, (a,b) => a+b);
答案 2 :(得分:2)
使用.NET 4 - 您可以使用ZIP
var sumList = numbers2.Zip(numbers,
(first, second) => first+second);
答案 3 :(得分:0)
如果你希望你的输出包含所有元素(或者想要了解Linq的内容),你可以像这样滚动自己的Zip重载:
public static IEnumerable<T> Zip<T>(IEnumerable<T> first, IEnumerable<T> second, Func<T,T,T> aggregator)
{
using (var firstEnumerator = first.GetEnumerator())
using (var secondEnumerator = second.GetEnumerator())
{
var movedFirstButNotSecond = false;
while ((movedFirstButNotSecond = firstEnumerator.MoveNext()) && secondEnumerator.MoveNext())
{
yield return aggregator(firstEnumerator.Current, secondEnumerator.Current);
movedFirstButNotSecond = false;
}
while (movedFirstButNotSecond || firstEnumerator.MoveNext())
{
yield return firstEnumerator.Current;
movedFirstButNotSecond = false;
}
while (secondEnumerator.MoveNext())
{
yield return secondEnumerator.Current;
}
}
}