1. ホーム
  2. c#

LINQパフォーマンスに関するFAQ

2023-10-01 23:30:10

質問

私はLINQについて理解しようとしています。 最も悩ましいことは、構文をよりよく理解するとしても、表現力のために知らず知らずのうちにパフォーマンスを犠牲にしたくないということです。

効果的な LINQ」のための情報または書籍の良い一元的なリポジトリはありますか? そうでなければ、あなた自身の個人的なお気に入りの高性能な LINQ のテクニックは何ですか?

私は主に LINQ to Objects に関心がありますが、LINQ to SQL と LINQ to XML に関するすべての提案ももちろん歓迎します。 ありがとうございます。

どのように解決するのですか?

LINQ が内部で行っていることを理解するだけで、パフォーマンスが低下しているかどうかを知るのに十分な情報が得られるはずです。

LINQがパフォーマンスを助ける簡単な例を挙げます。この典型的な昔ながらのアプローチを考えてみましょう。

List<Foo> foos = GetSomeFoos();
List<Foo> filteredFoos = new List<Foo>();
foreach(Foo foo in foos)
{
    if(foo.SomeProperty == "somevalue")
    {
        filteredFoos.Add(foo);
    }
}
myRepeater.DataSource = filteredFoos;
myRepeater.DataBind();

つまり、上記のコードは2回繰り返し処理を行い、フィルタリングされた値を保持するために2つ目のコンテナを割り当てることになります。なんという無駄でしょう。と比べてみてください。

var foos = GetSomeFoos();
var filteredFoos = foos.Where(foo => foo.SomeProperty == "somevalue");
myRepeater.DataSource = filteredFoos;
myRepeater.DataBind();

これは一度だけ(リピータがバインドされたとき)反復処理されます; 元のコンテナだけを使用します。 filteredFoos は単なる中間列挙子です。また、何らかの理由で、後でリピーターをバインドしないことにしても、何も無駄になることはありません。反復処理や評価も 1 度も行われません。

非常に複雑なシーケンス操作に入る場合、次のようにすることができます。 潜在的に LINQ固有の連鎖と遅延評価を活用することで、多くの利益を得ることができます。繰り返しますが、何事もそうですが、それが実際に何を行っているかを理解することが重要です。