Ответ 1
var c = a.Zip(b, (x, y) => x * y);
Для более сложного после редактирования:
var c = a.Zip(b, (x, y) => x > y ? x - y : 0);
Обратите внимание, что Zip
является методом расширения из Enumerable
, который действует на IEnumerable<T>
и Queryable
, который действует на IQueryable<T>
, поэтому возможно, что, если лямбда будет одной, с которой может иметь дело поставщик данных, ее можно обрабатывать как SQL запрос в базе данных или какой-либо другой способ, кроме встроенной памяти в .NET.
Кто-то упомянул, что это было новым с 4.0 в комментариях. Это не сложно реализовать для 3.5 самостоятельно:
public class MyExtraLinqyStuff
{
public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
{
//Do null checks immediately;
if(first == null)
throw new ArgumentNullException("first");
if(second == null)
throw new ArgumentNullException("second");
if(resultSelector == null)
throw new ArgumentNullException("resultSelector");
return DoZip(first, second, resultSelector);
}
private static IEnumerable<TResult> DoZip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
{
using(var enF = first.GetEnumerator())
using(var enS = second.GetEnumerator())
while(enF.MoveNext() && enS.MoveNext())
yield return resultSelector(enF.Current, enS.Current);
}
}
Для .NET2.0 или .NET3.0 вы можете иметь то же самое, но не как метод расширения, который отвечает на другой вопрос из комментариев; в то время не было идиоматического способа делать такие вещи в .NET, или, по крайней мере, не с твердым консенсусом среди тех, кого мы кодировали в .NET. У некоторых из нас были методы, подобные приведенным выше в наших инструментариях (хотя и не методы расширения), но это было тем более, что на нас влияли другие языки и библиотеки, чем что-либо еще (например, я делал такие вещи, как выше, из-за того, что я знал из С++ STL, но это был едва ли единственный возможный источник вдохновения)