【问题标题】:Splitting a list of objects into multiple separate lists based on a given criteria根据给定条件将对象列表拆分为多个单独的列表
【发布时间】:2014-04-11 06:09:09
【问题描述】:

考虑以下列表:

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 宽度的最大总数。例如,如果 W 等于 7,那么我需要获取 3 个包含 TableHeader 对象的列表,如下:

  1. Column1、Column2、Column3、Column4(自 3+2+1+1
  2. 第 5 列,第 6 列
  3. 第 7 列

任何帮助将不胜感激。

【问题讨论】:

    标签: c# linq linq-to-objects


    【解决方案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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 2021-05-21
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      • 2020-11-08
      • 2023-04-11
      相关资源
      最近更新 更多