2010-05-11 10 views
5

En otros idiomas (Ruby, Python, ...) que se puede utilizar zip(list1, list2) que funciona de esta manera:¿Linq/.NET3.5 admite un método 'zip'?

Si list1 is {1,2,3,4} y list2 is {a,b,c}

continuación zip(list1, list2) regresarían: {(1,a), (2,b), (3,c), (d,null)}

es un método tal disposición en las extensiones Linq de .NET?

Respuesta

12

.NET 4 nos da un método Zip pero no está disponible en .NET 3.5. Si tiene curiosidad, Eric Lippert provides an implementation of Zip que puede serle útil.

+0

respondido con una implementación más adelante que hace – katbyte

+0

@Steven: No, no es así: http://referencesource.microsoft.com/#System.Core/ sistema/LINQ/Enumerable.cs, 2b8d0f02389aab71 – Heinzi

0

ni aplicación llenará los valores que faltan (o comprobar que las longitudes son iguales) como la cuestión planteada.

aquí es una aplicación que puede:

public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult> (this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> selector, bool checkLengths = true, bool fillMissing = false) { 
     if (first == null) { throw new ArgumentNullException("first");} 
     if (second == null) { throw new ArgumentNullException("second");} 
     if (selector == null) { throw new ArgumentNullException("selector");} 

     using (IEnumerator<TFirst> e1 = first.GetEnumerator()) { 
      using (IEnumerator<TSecond> e2 = second.GetEnumerator()) { 
       while (true) { 
        bool more1 = e1.MoveNext(); 
        bool more2 = e2.MoveNext(); 

        if(! more1 || ! more2) { //one finished 
         if(checkLengths && ! fillMissing && (more1 || more2)) { //checking length && not filling in missing values && ones not finished 
          throw new Exception("Enumerables have different lengths (" + (more1 ? "first" : "second") +" is longer)"); 
         } 

         //fill in missing values with default(Tx) if asked too 
         if (fillMissing) { 
          if (more1) { 
           while (e1.MoveNext()) { 
            yield return selector(e1.Current, default(TSecond));   
           } 
          } else { 
           while (e2.MoveNext()) { 
            yield return selector(default(TFirst), e2.Current);   
           } 
          } 
         } 

         yield break; 
        } 

        yield return selector(e1.Current, e2.Current); 
       } 
      } 
     } 
    } 
+0

1 por notar el comportamiento de los valores que faltan ''. Sin embargo, esto es un error de mi parte - se ve como [ 'zip' función de Python] (http://docs.python.org/2/library/functions.html#zip) * * También se detiene al llegar al final de su argumento * más corto *, al igual que la versión de Linq. (Y mi suposición - se muestra en la pregunta - que estaba mal) –

+0

Es extraño para una función zip, por lo tanto, el valor predeterminado es no. Pero he tenido algunas situaciones en las que era deseable. – katbyte

Cuestiones relacionadas