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 クエリに変換することを提案しています。
他の誰かがこれに追加できますか?独自の小さなルールを持っている人はいますか? または、会社がルールの使用を提案/強制していますか?