Feedback

C# - LINQ Erweiterung: Range

Veröffentlicht von am 09.05.2014
(0 Bewertungen)
Diese Erweiterungsmethode wählt Elemente eier Liste in einem bestimmten Bereich aus. Dieser Bereich wird von 2 Elementen bestimmt, die durch 2 Funktionen ausgewählt werden. Nähere Informationen stehen in der XML Dokumentation.

Benötigte Namespaces
System
System.Collections.Generic
GFU-Schulungen  [Anzeige]

ASP.NET Core - Der Einstieg

In nur 3 Tagen lernen Sie, wie man mit ASP.NET Core und den Technologien MVC, Entity Framework, WebAPI und Razor professionelle Web-Anwendungs-Architekturen aufbaut. Diese Schulung ist der perfekte Einstieg, um datengetriebene und präsentations-orientierte Applikationen auf Basis der ASP.NET Core Plattform zu erstellen.

VB.NET Komplett

Sie stehen vo der Aufgabe, individuelle Anwendungen für Windows zu schreiben. Hier ist VB.NET die optimale Sprache. Sie erlernt sich recht leicht und passt sich komplett in die .NET Umgebung von Microsoft ein. Nach der Schulung entwickeln Sie anwenderfreundliche Programme in VB.NET . Mit den objektorientierten Modellen in VB.NET erzeugen Sie außerdem wiederverwendbare Komponenten.

/// <summary>
/// Wählt einen zusammenhängenden Bereich einer Sequenz aus, der zwischen 2 Elementen liegt, die durch je eine Bedingung ermittelt wurden.<para/>
/// Es können mehrere solche zusammenhängende Bereiche vereint werden.
/// </summary>
/// <typeparam name="T">Der Typ von dem die Elemente der Sequenz sind.</typeparam>
/// <param name="source">Die Quellliste.</param>
/// <param name="startCondition">Die Bedingung mit der das Startelement eines Bereichs ermittelt wird.</param>
/// <param name="endCondition">Die Bedingung mit der das Endelement eines Bereichs ermittelt wird.</param>
/// <param name="includeStart"><c>true</c>, wenn das Startelement mit zurück gegeben werden soll, andernfalls <c>false</c>.</param>
/// <param name="includeEnd"><c>true</c>, wenn das Endelement mit zurück gegeben werden soll, andernfalls <c>false</c>.</param>
/// <param name="multipleRanges"><c>true</c>, wenn bei einem weiteren Fund eines Startelements der neu gefundene Bereich ebenfalls zurück gegeben wird; andernfalls <c>false</c>.</param>
/// <returns>Eine Sequenz von Elementen aus <paramref name="source"/>, welche zwischen Elementen liegen, die den angegebenen Bedingungen entsprechen.</returns>
/// <remarks>Beim erstellen der neuen Liste wird jedes Element durchlaufen. Zu Beginn wird jedes Element mit der <paramref name="startCondition"/>-Funktion geprüft. Sobald 
/// ein Treffer erziehlt wurde, wird nur noch die <paramref name="endCondition"/>-Funktion zum prüfen aufgerufen. Sobald jetzt ein Treffer erziehlt wurde, beginnt die 
/// Prüfung der Elemente wieder mit der <paramref name="startCondition"/>-Funktion. Wenn <paramref name="multipleRanges"/> <c>true</c> ist, wird nach dem ersten Treffer mit der
/// <paramref name="endCondition"/>-Funktion die neue Sequenz zurück gegeben. </remarks>
/// <exception cref="System.ArgumentNullException">Wird ausgelöst, wenn <paramref name="source"/>, <paramref name="startCondition"/> oder <paramref name="endCondition"/> <c>null</c> ist.</exception>
public static IEnumerable<T> Range<T>(this IEnumerable<T> source, Func<T, bool> startCondition, Func<T, bool> endCondition, bool includeStart, bool includeEnd, bool multipleRanges)
{
    if (source == null)
        throw new ArgumentNullException("source");
    if (startCondition == null)
        throw new ArgumentNullException("startCondition");
    if (endCondition == null)
        throw new ArgumentNullException("endCondition");

    using (var enumerator = source.GetEnumerator())
    {
        bool ret = false;
        while (enumerator.MoveNext())
        {
            if (ret)
            {
                if (endCondition(enumerator.Current))
                {
                    if (includeEnd)
                        yield return enumerator.Current;
                    if (multipleRanges)
                        ret = false;
                    else
                        break;
                }
                else
                    yield return enumerator.Current;
            }
            else
            {
                if (startCondition(enumerator.Current))
                {
                    ret = true;
                    if (includeStart)
                        yield return enumerator.Current;
                }
            }
        }
    }
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!