2016-10-13 16 views
1

この場合、2つの異なる条件のためにProductsから数えられる2つの異なるLINQ式があります。とにかく、1つのLINQ式からこれらの2つのカウントを取り出すことができるのであれば、私はちょうど興味がありましたか?2つのLINQ式を1つに結合する

あなたが二回あなたのコレクションを反復処理を避けることができ Aggregateを使用
class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Product> Products = new List<Product>() 
     { 
      new Product() { ID = 1 }, 
      new Product() { ID = 2 }, 
      new Product() { ID = 3 }, 
      new Product() { ID = 4 }, 
      new Product() { ID = 5 }, 
      new Product() { ID = 6 } 
     }; 

     int all = Products.Count(); 
     int some = Products.Where(x => x.ID < 2).Count(); 
    } 
} 

public class Product 
{ 
    public int ID { get; set; } 
} 
+4

1つの関数呼び出しから2つの出力が必要ですか? – techspider

+0

必ずしもそうではありませんが、例としてそれを見て気にしないでください。 –

+0

関数はタプルなどを返すことができます。私の主な関心は、両方のカウントがちょうど1つのlinq式 –

答えて

6

var result = Products.Aggregate(new {a=0, s=0},(p,c) => 
        { 
         return new { a = p.a + 1, s = c.ID < 2 ? p.s + 1 : p.s }; 
        }); 

result.a == 6result.s == 2

あなたの代わりにしたい場合は、もちろん、あなたの結果を保持するクラスを作成することができます匿名型を使用しているのと同じように動作します。たとえば、関数から返さなければならない場合は、対処するほうが簡単かもしれません。

var result = new Tuple<int, int>(Products.Count, Products.Where(x => x.ID < 2).Count()); 

そしてpleseは発言O(1)複雑さの代わりを持っているProducts.Countプロパティの使用:Tuple<int, int>に使用してあなたがこれを行うことができます

public class CountResult 
{ 
    public int All { get; set; } 
    public int Some { get; set; } 
} 

public CountResult GetMyCount(IEnumerable<Product> products) 
{ 
    return products.Aggregate(new CountResult(), (p,c) => 
    { 
     p.All++; 
     if (c.ID < 2) // or whatever you condition might be 
     { 
      p.Some++; 
     } 
     return p; 
    }); 
} 
+0

最後に私はこの集計のオーバーロードを理解しています。あなたは確かに私のupvote –

+0

うん - これは間違いなく集約を行うには良い場所です。 – code4life

0

だからあなたのような何かを行うことができますO(N)なので、この実装のパフォーマンスについてはまったく心配する必要はありません。詳細はthis postをご覧ください。

+1

これは高価なことがあります。各アイテムは2回反復されます(**推奨されない** side-effetシーケンスの場合[ばかげた例:ランダムな値のシーケンス] 2つのカウントは異なるシーケンスになります) – Sehnsucht

+0

@meJustAndrew単なるコメントです。次の年に1,000人のユーザーがこの投稿を閲覧していると思われる人もいます。私は、彼があなたの投稿を削除するよう提案しているとは思っていません。単に掲載理由やその他の意図しない結果については推奨しないことを明確にしています。 – Quantic

+0

@Quantic私は自分の答えを更新し、パフォーマンスの向上を明らかにしました。 – meJustAndrew

関連する問題