5

假设我有这个号码列表:

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
4

2 回答 2

6

直接用 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;
}
于 2012-08-01T13:18:58.050 回答
4

你可以用聚合来做到这一点。

(旁注:使用 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();

}
于 2012-08-01T13:27:57.483 回答