The most obvious way for me would be to use Zip
twice.
For example,
var results = l1.Zip(l2, (x, y) => x + y).Zip(l3, (x, y) => x + y);
would combine (add) the elements of three List<int>
objects.
Update:
You could define a new extension method that acts like a Zip
with three IEnumerable
s, like so:
public static class MyFunkyExtensions
{
public static IEnumerable<TResult> ZipThree<T1, T2, T3, TResult>(
this IEnumerable<T1> source,
IEnumerable<T2> second,
IEnumerable<T3> third,
Func<T1, T2, T3, TResult> func)
{
using (var e1 = source.GetEnumerator())
using (var e2 = second.GetEnumerator())
using (var e3 = third.GetEnumerator())
{
while (e1.MoveNext() && e2.MoveNext() && e3.MoveNext())
yield return func(e1.Current, e2.Current, e3.Current);
}
}
}
The usage (in the same context as above) now becomes:
var results = l1.ZipThree(l2, l3, (x, y, z) => x + y + z);
Similarly, you three lists can now be combined with:
var results = list1.ZipThree(list2, list3, (a, b, c) => new { a, b, c });
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…