61

LINQ 拡張メソッドの 1 つの中で LINQ クエリ構文または Lambda 式のいずれかを使用することを選択するときに、誰かが何らかの規則に固執しますか (または、雇用主によって何らかの規則に固執することを強制されますか?)。これは、エンティティ、SQL、オブジェクトなど、あらゆるものに適用されます。

私たちの職場では、上司はラムダがまったく好きではなく、何にでもクエリ構文を使用していましたが、場合によっては読みにくいと感じました。

var names = collection.Select(item => item.Name);

var names = from item in collection
            select item.Name;

たぶん、条件を追加するときに、私が見つけた Lambda が少し乱雑になります。

var names = collection.Where(item => item.Name == "Fred")
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            select item.Name;

興味深いことに、コンパイラはこれをどのように扱いますか? 上記のLINQクエリがラムダにコンパイルされる方法を知っている人はいますか? Nameプロパティは要素ごとに呼び出されますか? 代わりにこれを行うと、パフォーマンスが向上する可能性がありますか? これは、ラムダがパフォーマンスの点でわずかに制御可能であることを意味しますか?

var names = collection.Select(item => item.Name)
                      .Where(name => name == "Fred");

確かに、より多くの式を使用し始めると、ラムダが乱雑になり、ここでクエリ構文を使用するようになります。

var names = collection.Where(item => item.Name == "Fred")
                      .OrderBy(item => item.Age)
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            order by item.Age
            select item.Name;

また、クエリ構文では実行できないことがいくつかあります。それらのいくつかは本当に単純だと思いますが (特に集計関数)、いいえ、LINQ 拡張メソッドの 1 つを最後に追加する必要があります。これは、ラムダ式を使用すると見栄えがよくなります。

var names = collection.Count(item => item.Name == "Fred");

var names = (from item in collection
            where item.Name == "Fred"
            select item).Count()

いくつかの単純なラムダ チェーンについても、ReSharperはそれらを LINQ クエリに変換することを提案しています。

他の誰かがこれに追加できますか?独自の小さなルールを持っている人はいますか? または、会社がルールの使用を提案/強制していますか?

4

1 に答える 1

40

翻訳に関する質問に答えると、クエリ式は常に C# 4 仕様の 7.16 (または C# 3 仕様の同等のもの) の規則に基づいて翻訳されます。プロパティについて質問している例ではName、それはクエリ式の変換の問題ではありません。それは、SelectandWhereメソッドがパラメーターとして受け取るデリゲートまたは式ツリーに対して何を行うかです。フィルタリングの前にプロジェクションを実行することが理にかなっている場合もあれば、そうでない場合もあります。

ちょっとしたルールですが、私が持っているルールは 1 つだけです。問題のクエリに対して最も読みやすい方法を使用してください。したがって、クエリが変更され、「どちらの形式がより読みやすいか」が同時に変更された場合は、使用する構文を変更します。

LINQ を使用する場合は少なくともどちらの構文でも問題なく読める必要があります。

複数の範囲変数 ( or 、または句など) を使用したクエリは、クエリ式を使用すると読みやすくなる傾向がありますが、それは厳密で迅速なルールとはほど遠いものですSelectManyJoinlet

于 2011-11-07T14:19:35.560 に答える