最近、ReSharper を使い始めました。
ReSharper は、ループにさまざまな条件が含まれている場合でも、コレクション (通常はforeach
)に対するすべてのループをステートメントに変換することを提案しています。Linq
- これによりパフォーマンスが向上しますか?
- これにより、コードが読みやすくなりますか?
一般に、この件に関して ReSharper の提案に従うべき場合と、すべきでない場合はいつですか?
これによりパフォーマンスが向上しますか?
一般に、パフォーマンスには影響しません。LINQ を使用するとパフォーマンスが向上または低下する状況を設計することは可能ですが、一般的なケースではそうではありません。
これにより、コードが読みやすくなりますか?
多くの場合、そうです。なぜなら、反復の仕組みを強調する構成を、反復の目的を強調する構成に置き換えるからです。
力学の強調:
var jacks = new List<Person>();
foreach (var person in persons)
{
if (person.Name == "Jack")
{
jacks.Add(person);
}
}
「このコードは人を繰り返し処理し、Jack という名前の人が見つかるたびに、jacks という名前のリストに追加します」.
目的の強調:
var jacks = persons.Where(p => p.Name == "Jack").ToList();
「ジャックという名前のすべての人をリストに入れます。そのリストをジャックと呼びます。」
また、2 番目のバージョンがはるかに短いことも問題ではないため、脳は最初のバージョンよりもはるかに簡単にすべてを一度に消費できます。
もう一つの例:
var furryAnimals = furryThings.Intersect(animals).ToArray();
LINQ を作成したり、独自の同等のものを作成したりせずに、この明快さに匹敵する方法は絶対にありません。ここで、 に inと in のfurryAnimals
両方が含まれていることがすぐにわかります。あなたが気にするのはそれだけです。furryThings
animals
これらのセットの交差がどのように計算されるかは正確には気にしません。計算には、実装の詳細としてディクショナリが含まれる場合があります。しかし、そのディクショナリの作成から始まるコードの代替バージョンは、最も重要でない 1 つのこと、つまり実装の詳細にすぐに注意を向けさせます。
一般に、この件に関して ReSharper の提案に従うべき場合と、すべきでない場合はいつですか?
この規則には常に例外があるので、ここでは例外を提示しようとはしません。しかし、一般的には、コードが正しく、保守可能で、高速であることを (通常はこの順序で) 望んでいます。どちらの方法でもコードが正しいと仮定するので、決定を下す必要があるときは常に次のことを考慮してください。
コードの速度が重要であるという具体的な証拠がある場合は、次のことも考慮してください。
答えは個人的なものです。
LINQ によって自動的にコードが高速化されるわけではありません。その逆が真である可能性が高くなります。見てみましょう: http://geekswithblogs.net/BlackRabbitCoder/archive/2010/04/23/c-linq-vs-foreach---round-1.aspx
LINQ を使用すると、コードを短くできます。
LINQ を使用すると、コードが読みやすくなります。しかし、LINQ は非常に複雑な組み合わせを持つこともあり、その場合は「古い」方法を選択します。
Resharper は、LINQ に変換されたコードの可読性を考慮していません。そのため、従来のループよりも理解しにくい非常に複雑な式を生成できます。
LINQ コードに変換してもパフォーマンスは変わらないため、どちらかというとコード スタイルが優先されます。