Feedback

C# - LINQ: IEnumerable<IEnumerable<T>> zu T[,]

Veröffentlicht von am 20.06.2015
(0 Bewertungen)
Diese Erweiterungsmethode wandelt eine verschachtelte Auflistung in ein zweidimensionales Array um.

Benötigte Namespaces
System
System.Collections.Generic
System.Linq
Snippet in VB übersetzen
/// <summary>
/// Erstellt ein zweidimensionales Array aus einer verschachtelten Liste.
/// </summary>
/// <typeparam name="T">Der Typ der Elemente in der Auflistung.</typeparam>
/// <param name="source">Die verschachtelte Quellauflistung</param>
/// <param name="throwIfLengthIsInconsistent"><c>true</c> wenn eine Exception ausgelöst werdne soll, wenn nicht alle Unterlisten die selbe Länge haben; andernfalls <c>false</c></param>
/// <param name="innerTo">Bestimmt ob eine innere Liste eine Zeile oder Spalte in dem Array sein soll.</param>
/// <returns>Ein zweidimensionales Array mit den Elementen von <paramref name="source"/></returns>
public static T[,] To2DArray<T>(this IEnumerable<IEnumerable<T>> source, bool throwIfLengthIsInconsistent, Array2DDirection innerTo)
{
    var x = source.Count();
    var y = throwIfLengthIsInconsistent ? source.Max(itemGroup => itemGroup.Count()) : source.First().Count();

    if (innerTo == Array2DDirection.Row)
    {
        var tmp = x;
        x = y;
        y = tmp;
    }

    var result = new T[x, y];

    int i = 0, j;
    foreach (var itemGroup in source)
    {
        j = 0;
        foreach (var item in itemGroup)
        {
            if (innerTo == Array2DDirection.Column)
                result[i, j] = item;
            else
                result[j, i] = item;
            ++j;
        }
        if (j != (innerTo == Array2DDirection.Column ? y : x) && throwIfLengthIsInconsistent)
            throw new ArgumentOutOfRangeException();
        ++i;
    }

    return result;
}

public enum Array2DDirection
{
    Column,
    Row,
}
Abgelegt unter LINQ, Erweiterungsmethode, Array, 2DArray.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!