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]

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

VB.NET Einführung

Die Schulung zeigt Ihnen, wie Sie einfache, benutzerorientierte Programme, die auf Datenbanken zugreifen, in VB.NET eigenständig entwickeln. 

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