1

この質問が尋ねるのと同じ結果を達成しようとしています:

リスト項目を 2 列以上で表示したい (動的配置)

ただし、スクリプトや CSS のハックを必要とする代わりに、「float: left;」を使用できるように、最初からデータの順序を変更したいと考えています。

リストが 1,2,3,4,5,6,7,8,9,10 のように返される代わりに

2列の場合、1,6,2,7,3,8,4,9,5,10が返されます

可能?

4

2 に答える 2

4

Linq を使用した 1 つの方法を次に示します。

var m = (int)Math.Ceiling(input.Count() / 2d); // two columns
var sorted = input.Select((x, i) => new { x, i })
                  .OrderBy(p => p.i % m)
                  .Select(p => p.x);

これは、任意の数の列にかなり簡単に一般化できます。必要に応じて、簡単に拡張メソッドに変換できます。

public static IEnumerable<T> Columns<T>(this IEnumerable<T> input, int cols)
{
    if (cols < 1)
    {
        throw new ArgumentOutOfRangeException(...);
    }

    var m = (int)Math.Ceiling(input.Count() / (double)cols);
    return input.Select((x, i) => new { x, i })
                .OrderBy(p => p.i % m)
                .Select(p => p.x);
}

// Usage
var input = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var sorted = input.Columns(2); // { 1, 6, 2, 7, 3, 8, 4, 9, 5, 10 }
于 2013-05-30T18:40:51.080 に答える
1

これで 2 つの列を簡単にカバーできます。

public static IEnumerable<T> UseTwoColumns<T>(List<T> list)
{
    int halfway = list.Count / 2;
    for (int i = 0; i < halfway; i++)
    {
        yield return list[i];
        yield return list[halfway + i];
    }
    if (list.Count % 2 != 0)
        yield return list[list.Count - 1];
}

列数をパラメーターとして渡すように一般化する場合は、少し複雑になります。

public static IEnumerable<T> UseColumns<T>(List<T> list, int columns)
{
    int columnHeight = list.Count / columns;
    for (int i = 0; i < columnHeight + 1; i++)
    {
        for (int j = 0; j < columns; j++)
        {
            int index = i + columnHeight * j;
            if (index < list.Count)
                yield return list[index];
        }
    }
}
于 2013-05-30T18:36:59.730 に答える