var c = a.Zip(b, (x, y) => x * y);
Pour le plus complexe, après votre montage :
var c = a.Zip(b, (x, y) => x > y ? x - y : 0);
Notez que Zip
est une méthode d'extension à la fois de Enumerable
qui agit sur IEnumerable<T>
et de Queryable
qui agit sur IQueryable<T>
Il est donc possible, si le lambda est traité par un fournisseur de requêtes donné, qu'il soit traité comme une requête SQL sur une base de données, ou d'une autre manière qu'en mémoire dans .NET.
Quelqu'un a mentionné que c'était une nouveauté de la version 4.0 dans les commentaires. Il n'est pas difficile de l'implémenter soi-même en 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);
}
}
Pour .NET2.0 ou .NET3.0, vous pouvez avoir la même chose, mais pas en tant que méthode d'extension, ce qui répond à une autre question des commentaires ; il n'y avait pas vraiment de manière idiomatique de faire de telles choses dans .NET à cette époque, ou du moins pas avec un consensus ferme parmi ceux d'entre nous qui codaient en .NET à l'époque. Certains d'entre nous avaient des méthodes comme celles mentionnées ci-dessus dans leurs boîtes à outils (mais pas des méthodes d'extension évidemment), mais c'était plus parce que nous étions influencés par d'autres langages et bibliothèques qu'autre chose (par exemple, je faisais des choses comme celles mentionnées ci-dessus à cause de ce que je savais de la STL de C++, mais ce n'était pas la seule source d'inspiration possible).