集团项目由总量

问题描述:

假设我有这个号码表:集团项目由总量

List<int> nu = new List<int>(); 
nu.Add(2); 
nu.Add(1); 
nu.Add(3); 
nu.Add(5); 
nu.Add(2); 
nu.Add(1); 
nu.Add(1); 
nu.Add(3); 

保持在同一顺序列表中的项目,才有可能小组在LINQ是6个这样的结果会是这样和项目像这样:

2,1,3 - 5 - 2,1,1 - 3 
+2

你结果不是“小于7”的分组。所有数字都小于7. – abatishchev 2012-08-01 13:16:14

+3

每组的总和小于7 – Johnny5 2012-08-01 13:17:00

+0

为什么(2,1,3)会在(5)的特定组中?他们都小于7 – saj 2012-08-01 13:17:34

你可以用Aggregate来完成。

(附注:使用LinqPad测试/写这些类型的查询,让您轻松)

给出了这些结果:

results

像这样:

class Less7Holder 
{ 
    public List<int> g = new List<int>(); 
    public int mySum = 0; 
} 

void Main() 
{ 
    List<int> nu = new List<int>(); 
    nu.Add(2); 
    nu.Add(1); 
    nu.Add(3); 
    nu.Add(5); 
    nu.Add(2); 
    nu.Add(1); 
    nu.Add(1); 
    nu.Add(3); 

    var result = nu .Aggregate(
     new LinkedList<Less7Holder>(), 
     (holder,inItem) => 
     { 
      if ((holder.Last == null) || (holder.Last.Value.mySum + inItem >= 7)) 
      { 
      Less7Holder t = new Less7Holder(); 
      t.g.Add(inItem); 
      t.mySum = inItem; 
      holder.AddLast(t); 
      } 
      else 
      { 
      holder.Last.Value.g.Add(inItem); 
      holder.Last.Value.mySum += inItem; 
      } 
      return holder; 
     }, 
     (holder) => { return holder.Select((h) => h.g);}); 

    result.Dump(); 

} 
+0

+1在LINQ解决方案被问 – 2012-08-01 17:41:58

与LINQ解决这个直接会是麻烦,而不是你可以做一个扩展方法:

// Assumptions: 
// (1) All non-negative, or at least you don't mind them in your sum 
// (2) Items greater than the sum are returned by their lonesome 
static IEnumerable<IEnumerable<int>> GroupBySum(this IEnumerable<int> source, 
    int sum) 
{ 
    var running = 0; 
    var items = new List<int>(); 
    foreach (var x in source) 
    { 
     if (running + x > sum && items.Any()) 
     { 
      yield return items; 
      items = new List<int>(); 
      running = 0; 
     } 

     running += x; 
     items.Add(x); 
    } 

    if (items.Any()) yield return items; 
} 
+1

我自己写了类似的代码 - 但为什么每次调用'ToArray'并清除现有的列表?为什么不直接返回列表并每次创建一个新列表? – 2012-08-01 13:19:45

+0

好'ol SE快速绘画比赛。发布时,我有73%使用相同的扩展方法完成。 – 2012-08-01 13:22:46

+0

@JonSkeet:没理由;感谢您的评论(更新)。 – user7116 2012-08-01 13:22:51