2015-11-03 51 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(); 
}