2015-11-03 53 views
-2

我有一个整数,我想分成基于满足一定条件的2名或多个列表清单的标准。例如:拆分分成几列表基于使用LINQ

List<int> myList = new List<int>(); 
myList.Add(100); 
myList.Add(200); 
myList.Add(300); 
myList.Add(400); 
myList.Add(200); 
myList.Add(500); 

我想列表分割成几个列表,其中的每一个含有总< = 600在上述所有项目,这将随后导致3级独立的列表的对象。

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

理想情况下,我想它是一个单一的LINQ声明。

+6

你尝试过什么和为什么它必须在LINQ甚至一个LINQ声明? –

+2

你有什么尝试?该代码做了什么?这与你希望做的有什么不同?随着这些问题的答案,请提供[好了,_minimal_,_complete_代码示例](http://stackoverflow.com/help/mcve)支持这些问题的答案。堆栈溢出不是代码写入服务。 –

+1

这是不可能的单LINQ声明,但一行LINQ。或者你必须为此实施你自己的延期会面。 –

回答

0

虽然是可行的,这是一个什么样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(); 
0

这里是解决你的问题。我不知道这是最好的情况下求解,但它一定会做的工作:

List<int> First = myList.Where(x => x <= 300).ToList(); 
List<int> Second = myList.Where(x => x == 400 || x == 200).ToList(); 
List<int> Third = myList.Where(x => x == 500).ToList(); 

它通过满足要求,那么它会转换成IEnumerable的名单列表,检查值做查询。

0

这将做你想做的任何尺寸的名单,但也许不是越短,你正在寻找。你将不得不编写一个LINQ扩展方法来缩短它,但随后它会变得更复杂一点。

List<int> myList = new List<int>(); 
myList.Add(100); 
myList.Add(200); 
myList.Add(300); 
myList.Add(400); 
myList.Add(200); 
myList.Add(500); 

var result = new List<List<int>>(); 
var skip = 0; 
while (skip < myList.Count) 
{ 
    var sum = 0; 
    result.Add(myList.Skip(skip).TakeWhile(x => 
    { 
     sum += x; 
     return sum <= 600; 
    }).ToList()); 
    skip += result.Last().Count(); 
}