16

私はいくつかのC#3コレクションフィルターのプロトタイプを作成していて、これに出くわしました。私は製品のコレクションを持っています:

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?"
    }
};

ここで、LINQを使用してフィルター処理すると、期待どおりに機能します。

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

また、Where拡張メソッドをLambdaと組み合わせて使用​​すると、フィルターも機能します。

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

質問:違いは何ですか、そしてなぜ一方を他方の上に使用するのですか?

4

4 に答える 4

6

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

言い換えれば、違いはないはずです。

ただし、2つのコードでは、最初に.ToListを呼び出さないため、最初のコードは列挙可能なデータソースを生成しますが、.ToListを呼び出す場合、2つは同じである必要があります。

于 2008-08-07T19:25:49.487 に答える
4

前述のように、dはIEnumerable<MyProduct>fがList<MyProduct>

変換はC#コンパイラによって行われます

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形式で読み取ることができます。

于 2008-08-11T12:52:52.080 に答える
0

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

于 2008-08-17T04:35:51.053 に答える
0

ToList の違いを除けば、#2 はより読みやすく自然な IMO です。

于 2008-08-08T04:19:00.847 に答える