Diese Erweiterungsmethode wandelt eine verschachtelte Auflistung in ein zweidimensionales Array um.
Benötigte Namespaces
System
System.Collections.Generic
System.Linq
/// <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,
}
Kommentare zum Snippet