Linq - 如何添加两个列表的内容

时间:2011-11-28 17:31:48

标签: c# linq

我有两个IEnumberable<double>列表。

如何使用Linq将一个列表的每个值添加到另一个列表中相同位置的值?

4 个答案:

答案 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);

您可以找到.NET 3.5 implementation here

答案 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;
        }
    }
}