2011-01-10 10 views
0

私は高速で、どちらが優先される表現思っていた:Linq、lambda - どちらの文が高速ですか?

myList.Select(a => a.Property) 
     .Where(a => !String.IsNullOrEmpty(a)) 

myList.Where(a => !String.IsNullOrEmpty(a.Property)) 
     .Select(a => a.Property) 

、なぜもちろん?

一般的に私の質問は:Whereの後にSelectまたはSelectとそれに続いてWhereを使用する必要がありますか?

+3

これらは同じではなく、どちらもコンパイルされません。 2番目のものは、 'a =>!string.IsNullOrEmpty(a.Property)' – Kobi

+0

固定コードでなければなりません。 –

+0

@エモン - ほとんど、私は余分な 'a =>'を取り出しました。ありがとう! – Kobi

答えて

1

誰も知ることができませんので、測定する必要があります。 50項目のリストを考え、40項目がフィルタ基準を満たしている。

プロジェクトでフィルタリングすると、このアプローチはa.Propertyへのアクセス回数を最小限に抑えます。 100件の匿名メソッド呼び出しと50件のプロパティアクセス。

myList 
    .Select(a => a.Property) 
    .Where(a => !String.IsNullOrEmpty(a)) 

このプロジェクトをプロットすると、この方法では匿名メソッドの呼び出し回数が最小限に抑えられます。 90件の匿名メソッド呼出しと90件のプロパティアクセス。

myList 
    .Where(a => !String.IsNullOrEmpty(a.Property)) 
    .Select(a => a.Property) 

私たちは、匿名メソッド呼び出しのコスト対あなたの財産の実装のコストを知らないので、パフォーマンスの違いについて推論する方法はありません。

+0

+1私がより明確に言うことを意味した –

1

最初にデータをフィルタリングし(Whereを使用して)、次にどのデータを選択するか(Selectを使用)を選択することをお勧めします。

フィルタリングしているデータによっては、パフォーマンスが異なる場合がありますが、2番目のものはフローが多いようです。

0

これはLinqプロバイダによって異なります。

例えばLinq2Sqlでは、両方のステートメントが同じです。これは、データベースに対して同じSQLを生成するためです。

Linq2Objectsでは、異なる動作をする可能性があります。

+0

こんにちは、何らかの理由で、2人の人が同じ答えを書くことができると信じられない男(特に正しいと思われる場合)。 –

0

大したことはありません。上記のように、「クエリ」の残りの部分が投影されたデータのみを参照する場合、最初にプロジェクトを作成してからフィルタリングすることもできます。

最初にフィルタリングする必要はありません。最初にSelectを呼び出すことで、より少数のプロパティアクセサーが実行されますが、その違いはどちらかというと小さいかもしれません。

複雑なクエリを書く場合は、できるだけ早くデータの範囲を小さくすることをお勧めします。この場合、Whereの前にSelectと書くと、より短いコードになります結局のところ、関連するビット(ここでは文字列)にのみ焦点を当てることで、読者は残りのクエリでより複雑なオブジェクトを無視することができます。しかし、このような小さなクエリでは、この利点はかなり無意味です。

関連する問題