Feedback

C# - generische zip funktion

Veröffentlicht von am 11.02.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.
GFU-Schulungen  [Anzeige]

VB.NET Aufbau

Sie verfügen nach der Schulung über fundierte Kenntnisse in der Arbeit mit objektorientierten Modellen in VB.NET und können wiederverwendbare Komponenten eigenständig erzeugen.

VB.NET 2017/2015/2013 Einführung

Das Seminar befähigt Sie zur eigenständigen Entwicklung von anwenderorientierten Programmen in VB.NET, worin auch der Einsatz von Datenbanken enthalten ist.

/// <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!