/// <summary>
/// Definiert die Funktion zum Erzeugen der Ergebniselemente
/// </summary>
public delegate Tout ZipFunction<TinFirst,TinSecond , Tout>(TinFirst first, TinSecond second);
/// <summary>
/// Implementiert das Zipfunktional auf zwei Listen
/// </summary>
public static IEnumerable<Tout> Zip<TinFirst,TinSecond , Tout>(IEnumerable<TinFirst> first,
IEnumerable<TinSecond> second, ZipFunction<TinFirst, TinSecond , Tout> zipFunction)
{
IEnumerator<TinFirst> left = first.GetEnumerator();
IEnumerator<TinSecond > right = second.GetEnumerator();
while(left.MoveNext() && right.MoveNext())
{
yield return zipFunction(left.Current, right.Current);
}
}
//Beispiel: die ersten 5 Quadratzehlen (es ist klar dass das auch einfacher geht aber es sit ja auch nur ein Beispiel
int[] aList = { 1, 2, 3, 4, 5 };
int[] bList = { 1, 2, 3, 4, 5 };
IEnumerable<int> square = Zip<int, int, int>(aList, bList,
delegate(int a, int b)
{
return a * b;
});