使用 LINQ 根据条件将列表拆分为多个列表

Jus*_*ork -1 c# linq

我有一个整数列表,我想根据满足特定条件将其分成 2 个或更多列表。例如:

List<int> myList = new List<int>();
myList.Add(100);
myList.Add(200);
myList.Add(300);
myList.Add(400);
myList.Add(200);
myList.Add(500);
Run Code Online (Sandbox Code Playgroud)

我想将列表拆分为多个列表,每个列表包含总计 <= 600 的所有项目。在上面,它将产生 3 个单独的 List 对象。

  • 列表 1 将包含 100, 200 300
  • 列表 2 将包含 400, 200
  • 列表 3 将包含 500

理想情况下,我希望它是单个 LINQ 语句。

Iva*_*oev 5

虽然可行,但这是 LINQ适合的一个很好的例子。自行检查。

拥有

var myList = new List<int> { 100, 200, 300, 400, 200, 500, };
int maxSum = 600;
Run Code Online (Sandbox Code Playgroud)

“纯粹”LINQ(聚合的力量)

var result = myList.Aggregate(
    new { Sum = 0, List = new List<List<int>>() },
    (data, value) =>
    {
        int sum = data.Sum + value;
        if (data.List.Count > 0 && sum <= maxSum)
            data.List[data.List.Count - 1].Add(value);
        else
            data.List.Add(new List<int> { (sum = value) });
        return new { Sum = sum, List = data.List };
    },
    data => data.List)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

上述内容的正常(非 LINQ)实现

var result = new List<List<int>>();
int sum = 0;
foreach (var value in myList)
{
    if (result.Count > 0 && (sum += value) <= maxSum)
        result[result.Count - 1].Add(value);
    else
        result.Add(new List<int> { (sum = value) });
}
Run Code Online (Sandbox Code Playgroud)

为了完整性(和一些乐趣),“Hackish”LINQ(闭包和 C# 运算符的强大功能)

int sum = 0, key = -1;
var result = myList.GroupBy(x => key >= 0 && (sum += x) <= maxSum ? key : ++key + (sum = x) * 0, (k, e) => e.ToList()).ToList();
Run Code Online (Sandbox Code Playgroud)