雖然是可行的,這是一個什麼樣LINQ是不的一個很好的例子。自行檢查。
具有
var myList = new List<int> { 100, 200, 300, 400, 200, 500, };
int maxSum = 600;
「純」 LINQ(的Aggregate功率)
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();
正常(非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) });
}
出於完整性的(和一些有趣的),一「的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();
你嘗試過什麼和爲什麼它必須在LINQ甚至一個LINQ聲明? –
你有什麼嘗試?該代碼做了什麼?這與你希望做的有什麼不同?隨着這些問題的答案,請提供[好了,_minimal_,_complete_代碼示例](http://stackoverflow.com/help/mcve)支持這些問題的答案。堆棧溢出不是代碼寫入服務。 –
這是不可能的單LINQ聲明,但一行LINQ。或者你必須爲此實施你自己的延期會面。 –