集团项目由总量
假设我有这个号码表:集团项目由总量
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
你可以用Aggregate来完成。
(附注:使用LinqPad测试/写这些类型的查询,让您轻松)
给出了这些结果:
像这样:
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();
}
+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;
}
我自己写了类似的代码 - 但为什么每次调用'ToArray'并清除现有的列表?为什么不直接返回列表并每次创建一个新列表? – 2012-08-01 13:19:45
好'ol SE快速绘画比赛。发布时,我有73%使用相同的扩展方法完成。 – 2012-08-01 13:22:46
@JonSkeet:没理由;感谢您的评论(更新)。 – user7116 2012-08-01 13:22:51
你结果不是“小于7”的分组。所有数字都小于7. – abatishchev 2012-08-01 13:16:14
每组的总和小于7 – Johnny5 2012-08-01 13:17:00
为什么(2,1,3)会在(5)的特定组中?他们都小于7 – saj 2012-08-01 13:17:34