c# - 如何将列表排序为 2 列或更多列

标签 c#

我正在努力实现与这个问题相同的结果:

I want to show list items as 2 or more columns (dynamic alignment)

除此之外,我不需要脚本或 css hack,而是想重新排序数据,以便我可以使用“float: left;”

所以列表不会像 1,2,3,4,5,6,7,8,9,10 那样返回

对于两列,它会返回 1,6,2,7,3,8,4,9,5,10

可能吗?

最佳答案

这是一种使用 Linq 的方法:

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 }

关于c# - 如何将列表排序为 2 列或更多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16843506/

相关文章:

c# - Linq 查询中的匿名类型与元组,性能注意事项

c# - 当属性在 C# 中只有 getter 时如何创建属性更改事件

c# - FileSystemEventHandler 的附加参数

c# - 如何在转发器 C# 中传递多个选中的复选框值

c# - 将图像从内存流添加到 Excel 文档

c# - protobuf-net:属性与字段

c# - 将 vector3 转换为变换

c# - 并行运行任务

c# - Visual Studio 2013 编码的 UI 测试

c# - 我应该如何设置我的集成测试以将测试数据库与 Entity Framework 一起使用?