Feedback

C# - generische zip funktion

Veröffentlicht von am 2/11/2008
(1 Bewertungen)
In der Klasse Array werden einige Listenfunktionale implementiert (Foreach, ConvertAll,...) einige Fehlen aber. So zum Beispiel "zip". Das Funktional Zip nimmt als Input zwei Listen (nicht notwendiger Weise gleich en Typs und gleicher Länge) und gibt eine Liste eines eventuell 3. Typs mit der Länge der kürzeren der beiden Ausgangslisten zurück. Jedes der Ergebniselemente wird über eine ZipFunktion berechnet.

Im Beispiel wird ein Enumerator erzeugt. Dadurch ist es möglich das Funktional als Lazy zu implementieren. Es werden die einzelnen Elemente also erst dann berechnet wenn auf sie zugegriffen wird.
/// <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;
});
Abgelegt unter Zip, Enumerator, Generic, yield, lazy.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!