Feedback

C# - Dimensionen einer zweidimenisonale Liste vertauschen

Veröffentlicht von am 13.12.2014
(0 Bewertungen)
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

 

Logge dich ein, um hier zu kommentieren!