2012-08-01 9 views
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 
+2

あなたを(サイドノート:使用LinqPadクエリのこれらの種類を書く/テストするために、それが容易になります)

は、これらの結果を提供します結果は「7未満」でグループ化されていません。すべての数値は7未満です。 – abatishchev

+3

すべてのグループの合計が7未満です – Johnny5

+0

なぜ(2,1,3)が(5)に対してスピアレートグループに入るのですか?彼らは両方とも7未満です – saj

答えて

4

あなたは集計でそれを行うことができます。

このよう

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の解決策 –

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; 
} 
+1

私は同じようなコードを書いていました - しかし、いつも 'ToArray'を呼び出して既存のリストをクリアするのはなぜですか?なぜリストを返して毎回新しいリストを作成してみませんか? –

+0

グッド 'オルSEクイックドローコンテスト。私はこの記事が掲載されたときに同じ拡張方法で73%を完成しました。 –

+0

@JonSkeet:理由はありません。レビューのおかげで(更新された)。 – user7116

関連する問題