2008-08-07 11 views
11

私はいくつかのC#3コレクションフィルタのプロトタイプを作成しています。 私は製品のコレクションを持っている:私はフィルタリングするためにLINQを使用する場合、予想通りコレクションをフィルタリングするためにLINQtoObjects上でlambdaを使用する拡張メソッドを使用する場合

public class MyProduct 
{ 
    public string Name { get; set; } 
    public Double Price { get; set; } 
    public string Description { get; set; } 
} 

var MyProducts = new List<MyProduct> 
{    
    new MyProduct 
    { 
     Name = "Surfboard", 
     Price = 144.99, 
     Description = "Most important thing you will ever own." 
    }, 
    new MyProduct 
    { 
     Name = "Leash", 
     Price = 29.28, 
     Description = "Keep important things close to you." 
    } 
    , 
    new MyProduct 
    { 
     Name = "Sun Screen", 
     Price = 15.88, 
     Description = "1000 SPF! Who Could ask for more?" 
    } 
}; 

は今、それが動作します:

var d = (from mp in MyProducts 
      where mp.Price < 50d 
      select mp); 

そして、私はフィルタとして働くラムダと組み合わせた場合には拡張メソッドを使用している場合うまく:

var f = MyProducts.Where(mp => mp.Price < 50d).ToList(); 

質問:違いは何ですか、なぜ他の上のいずれかを使用しますか?

答えて

5

LINQは、コードのようにメソッド呼び出しに変わります。

つまり、違いはありません。

しかし、あなたの2つのコードでは、最初に.ToListを呼び出さないので、コードの最初の部分が列挙可能なデータソースを生成しますが、その上で.ToListを呼び出すと、2つは同じでなければなりません。 fは変換がC#コンパイラによって行われるList<MyProduct>

いる間述べdはIEnumerable<MyProduct>であろうようにToListメソッド差以外

0

は、#2は、より多くの可読およびIMO

4

自然である

var d = 
    from mp in MyProducts 
    where mp.Price < 50d 
    select mp; 

(ILにコンパイルする前に、ジェネリックを展開して):

var d = 
    MyProducts. 
    Where<MyProduct>(mp => mp.Price < 50d). 
    Select<MyProduct>(mp => mp); 
    //note that this last select is optimised out if it makes no change 

この単純なケースではほとんど違いがないことに注意してください。 Linqが本当に貴重なものになるのは、はるかに複雑なループです。

例えば、このステートメントには、グループバイス、オーダー、およびいくつかのletステートメントが含まれ、等価の.Method().Method.Method()が複雑になる場合でも、Linq形式で読み取ることができます。

0

dの構文は、コンパイラによって拡張メソッドと同じILに変換されます。 "SQLのような"構文は、LINQ式を表現するためのより自然な方法であると考えられています(私は個人的には拡張メソッドを好みます)。既に指摘したように、最初の例はIEnumerableの結果を返しますが、2番目の例はToList()の呼び出しのためListの結果を返します。 2番目の例でToList()呼び出しを削除すると、WhereはIEnumerable結果を返すときと同じ結果を返します。

関連する問題