Diese Funktion tauscht die Dimensionen einer Zweidimensionalen Liste.
So kann beispielsweise aus einem int[][] mit den Werten {1,2,3},{4,5,6} das Array {1,4},{2,5},{3,6} gemacht werden.
Sollte eine Zeile weniger Werte als Andere enthalten, werden diese Stellen mit dem (optional selbst bestimmbaren) Standardwert gefüllt.
Benötigter Namespace
System.Collections.Generic
/// <summary>
/// Vertauscht die Dimensionen einer Zweidimensionalen Liste.
/// </summary>
/// <typeparam name="T">Der Typ der Elemente in der Liste.</typeparam>
/// <param name="source">Die Zweidimensioanle Quellliste.</param>
/// <param name="default">Der Standardwert, welche eingesetzt werden soll, wenn ein Datensatz weniger Werte enthält, als die anderen.</param>
public static IEnumerable<IEnumerable<T>> SelectReverse<T>(this IEnumerable<IEnumerable<T>> source, T @default = default(T))
{
List<IEnumerator<T>> enus = new List<IEnumerator<T>>(); try
{
foreach (var item in source)
enus.Add(item.GetEnumerator());
while (_MoveAllNext(enus))
{
yield return _SelectNext(enus, @default);
}
}
finally
{
foreach (var enu in enus)
if (enu != null)
enu.Dispose();
}
}
private static IEnumerable<T> _SelectNext<T>(List<IEnumerator<T>> enus, T @default)
{
foreach (var enu in enus)
{
if (enu == null)
yield return @default;
else
yield return enu.Current;
}
}
private static bool _MoveAllNext<T>(List<IEnumerator<T>> enus)
{
bool flag = false;
for (int i = 0; i < enus.Count; ++i)
{
if (enus[i] != null)
{
if (enus[i].MoveNext())
flag = true;
else
{
enus[i].Dispose();
enus[i] = null;
}
}
}
return flag;
}
Kommentare zum Snippet