webapi net from asp .net python list iteration

.net - net - download file http angular



¿Hay un método zip en.Net? (4)

No, no hay tal función en .NET. Has implementado el tuyo. Tenga en cuenta que C # no es compatible con las tuplas, por lo que el azúcar de sintaxis similar a Pitón también falta.

Puedes usar algo como esto:

class Pair<T1, T2> { public T1 First { get; set;} public T2 Second { get; set;} } static IEnumerable<Pair<T1, T2>> Zip<T1, T2>(IEnumerable<T1> first, IEnumerable<T2> second) { if (first.Count() != second.Count()) throw new ArgumentException("Blah blah"); using (IEnumerator<T1> e1 = first.GetEnumerator()) using (IEnumerator<T2> e2 = second.GetEnumerator()) { while (e1.MoveNext() && e2.MoveNext()) { yield return new Pair<T1, T2>() {First = e1.Current, Second = e2.Current}; } } } ... var ints = new int[] {1, 2, 3}; var strings = new string[] {"A", "B", "C"}; foreach (var pair in Zip(ints, strings)) { Console.WriteLine(pair.First + ":" + pair.Second); }

En Python, hay una función muy ordenada llamada zip que se puede usar para iterar a través de dos listas al mismo tiempo:

list1 = [1, 2, 3] list2 = ["a", "b", "c"] for v1, v2 in zip(list1, list2): print v1 + " " + v2

El código anterior debe producir lo siguiente:

1 a 2 b 3 c

Me pregunto si hay un método como este disponible en .Net. Estoy pensando en escribirlo yo mismo, pero no tiene sentido si ya está disponible.


También hay uno en F #:

let zipped = Seq.zip firstEnumeration secondEnumation


Hasta donde yo sé, no es así. Escribí uno para mí (así como algunas otras extensiones útiles y las puse en un proyecto llamado NExtension on Codeplex.

Aparentemente las extensiones Paralelas para .NET tienen una función Zip.

Aquí hay una versión simplificada de NExtension (pero consulte los métodos de extensión más útiles):

public static IEnumerable<TResult> Zip<T1, T2, TResult>(this IEnumerable<T1> source1, IEnumerable<T2> source2, Func<T1, T2, TResult> combine) { using (IEnumerator<T1> data1 = source1.GetEnumerator()) using (IEnumerator<T2> data2 = source2.GetEnumerator()) while (data1.MoveNext() && data2.MoveNext()) { yield return combine(data1.Current, data2.Current); } }

Uso:

int[] list1 = new int[] {1, 2, 3}; string[] list2 = new string[] {"a", "b", "c"}; foreach (var result in list1.Zip(list2, (i, s) => i.ToString() + " " + s)) Console.WriteLine(result);


Actualización: está incorporado en C # 4 como método System.Linq.Enumerable.Zip

Aquí hay una versión de C # 3:

IEnumerable<TResult> Zip<TResult,T1,T2> (IEnumerable<T1> a, IEnumerable<T2> b, Func<T1,T2,TResult> combine) { using (var f = a.GetEnumerator()) using (var s = b.GetEnumerator()) { while (f.MoveNext() && s.MoveNext()) yield return combine(f.Current, s.Current); } }

Falló la versión C # 2 ya que estaba mostrando su edad.