Feedback

LINQ Erweiterung: Split

Sprache: C#

Diese Erweiterungsmethode ist in der Lage eine Liste an bestimmten Elementen aufzuspalten. [b]Beispiel[/b] Ausgangsliste: {1, 2, 3, 2, 4, 5, 3, 6, 5, 7, 3, 3, 5} Splitten an Elementen = 3 Ergebnis: {1, 2}, {2, 4, 5}, {6, 5, 7}, { }, {5} Als Code: [code]int[] list = { 1, 2, 3, 2, 4, 5, 3, 6, 5, 7, 3, 3, 5 }; var res = list.Split(x => x == 3).Select(x => x.ToArray()).ToArray(); if (Debugger.IsAttached) Debugger.Break();[/code] [b]Benötigte Namespaces[/b] System System.Collections.Generic [b]Für das Beispiel[/b] System.Diagnostics System.Linq
/// <summary>
/// Spaltet eine Sequenz von Elementen, an Elementen mit bestimmten Merkmalen, in mehrere Teilsequenzen auf.
/// </summary>
/// <typeparam name="T">Der Typ der Elemente.</typeparam>
/// <param name="source">Die zu spaltende Sequenz.</param>
/// <param name="splitter">Die Funktion, mit der die Elemente ermittelt werden, an denen die Sequenz aufgespalten werden soll.</param>
/// <returns>Eine Sequenz mit Teilsequenzen von <paramref name="source"/>, aufgespalten an Elementen, die mit <paramref name="splitter"/> ermittelt wurden.</returns>
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, Func<T, bool> splitter)
{
    using (var enu = source.GetEnumerator())
    {
        while (enu.MoveNext())
        {
            yield return GetInnerSequence(enu, splitter).ToList();
        }
    }
}

private static IEnumerable<T> GetInnerSequence<T>(IEnumerator<T> enu, Func<T, bool> splitter)
{
    do
    {
        if (splitter(enu.Current))
            yield break;
        yield return enu.Current;
    } while (enu.MoveNext());
}
/// <summary>
/// Spaltet eine Sequenz von Elementen, an Elementen mit bestimmten Merkmalen, in mehrere Teilsequenzen auf.
/// </summary>
/// <typeparam name="T">Der Typ der Elemente.</typeparam>
/// <param name="source">Die zu spaltende Sequenz.</param>
/// <param name="splitter">Die Funktion, mit der die Elemente ermittelt werden, an denen die Sequenz aufgespalten werden soll.</param>
/// <returns>Eine Sequenz mit Teilsequenzen von <paramref name="source"/>, aufgespalten an Elementen, die mit <paramref name="splitter"/> ermittelt wurden.</returns>
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, Func<T, bool> splitter)
{
    using (var enu = source.GetEnumerator())
    {
        while (enu.MoveNext())
        {
            yield return GetInnerSequence(enu, splitter).ToList();
        }
    }
}

private static IEnumerable<T> GetInnerSequence<T>(IEnumerator<T> enu, Func<T, bool> splitter)
{
    do
    {
        if (splitter(enu.Current))
            yield break;
        yield return enu.Current;
    } while (enu.MoveNext());
}