Feedback

C# - LINQ Erweiterung: Split

Veröffentlicht von am 19.07.2014
(0 Bewertungen)
Diese Erweiterungsmethode ist in der Lage eine Liste an bestimmten Elementen aufzuspalten.

Beispiel
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:
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();


Benötigte Namespaces
System
System.Collections.Generic
Für das Beispiel
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());
}
Abgelegt unter Erweiterungsmethode, Extension, Linq, Split.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!