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);

リストアイテムを同じ順序に保つと、合計が6であるlinqのアイテムをグループ化できるため、結果は次のようになります。

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

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();

}
于 2012-08-01T13:27:57.483 に答える