我有一个整数列表,我想根据满足特定条件将其分成 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 对象。
理想情况下,我希望它是单个 LINQ 语句。
虽然可行,但这是 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)