7 votes

Comment utiliser Zip sur trois IEnumerables

Duplicata possible :
Créer des éléments à partir de 3 collections en utilisant Linq

J'ai effectué un zippage de deux séquences comme suit.

IEnumerable<Wazoo> zipped = arr1.Zip(arr2, (outer, inner) =>
  new Wazoo{P1 = outer, P2 = inner});

Je viens de réaliser que je vais utiliser trois séquences, et non deux. Donc j'ai essayé de redessiner le code à quelque chose comme ça :

IEnumerable<Wazoo> zipped = arr1.Zip(arr2, arr3, (e1, e2, e3) =>
  new Wazoo{P1 = e1, P2 = e2, P3 = e3});

Bien sûr, ça n'a pas marché. Y a-t-il un moyen de déployer Zip pour intégrer ce que je vise ? Existe-t-il une autre méthode pour une telle utilisation ? Devrai-je zipper deux des séquences, puis les zipper avec la troisième en les dézippant au passage ?

A ce stade, je suis sur le point de créer un simple for -boucle et yield return la structure demandée. Dois-je le faire ? Je suis sur .Net 4.

11voto

Servy Points 93720

Vous pouvez soit utiliser deux appels à la fonction existante Zip (ce serait un peu salissant, mais ça marcherait) ou vous pouvez simplement faire votre propre Zip qui prend 3 séquences.

public static IEnumerable<TResult> Zip<TFirst, TSecond, TThird, TResult>
    (this IEnumerable<TFirst> source, IEnumerable<TSecond> second
    , IEnumerable<TThird> third
    , Func<TFirst, TSecond, TThird, TResult> selector)
{
    using(IEnumerator<TFirst> iterator1 = source.GetEnumerator())
    using(IEnumerator<TSecond> iterator2 = second.GetEnumerator())
    using (IEnumerator<TThird> iterator3 = third.GetEnumerator())
    {
        while (iterator1.MoveNext() && iterator2.MoveNext()
            && iterator3.MoveNext())
        {
            yield return selector(iterator1.Current, iterator2.Current,
                iterator3.Current);
        }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X