根据给定条件将对象列表拆分为多个单独的列表

时间:2014-04-11 06:09:09

标签: c# linq linq-to-objects

考虑以下列表:

var headers = new List<TableHeader>()
{
    new TableHeader("Column1", 3),
    new TableHeader("Column2", 2),
    new TableHeader("Column3", 1, Alignment.Right),
    new TableHeader("Column4", 1),
    new TableHeader("Column5", 1),
    new TableHeader("Column6", 6, Alignment.Right),
    new TableHeader("Column7", 2, Alignment.Right),
};

TableHeader构造函数中的第二个参数是Width。

我想将上面的列表拆分为N个单独的列表,每个列表包含总宽度最大值。例如,如果W等于7,那么我需要获得包含TableHeader对象的3个列表,如下所示:

  1. Column1,Column2,Column3,Column4(自3 + 2 + 1 + 1 <= 7)。
  2. 第5栏,第6栏
  3. Column7
  4. 任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

这是我已经实施的。还有更好的主意吗?

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, double maxWidth) where T : TableHeader
{
    while (source.Any())
    {
        int skip = 0;

        double totalWidth = 0;
        yield return source.TakeWhile(h =>
        {
            totalWidth += h.Width;
            if (totalWidth <= maxWidth)
                skip++;

            return totalWidth <= maxWidth;
        });

        source = source.Skip(skip);
    }
}