誰かがLINQ関数のWhere(..)とFindAll(..)の違いを説明できますか?どちらも同じことをしているようです...
FindAll()
は_List<T>
_型の関数であり、Where
のようなLINQ拡張メソッドではありません。 LINQ拡張メソッドは、IEnumerable
を実装するすべての型で機能しますが、FindAll
は_List<T>
_インスタンス(またはもちろん、それを継承するクラスのインスタンス)でのみ使用できます。
また、実際の目的も異なります。 Where
は、オブジェクトが列挙されたときにオンデマンドで実行されるIEnumerable
のインスタンスを返します。 FindAll
は、要求された要素を含む新しい_List<T>
_を返します。 FindAll
は、IEnumerable
のインスタンスでWhere(...).ToList()
を呼び出すようなものです。
私にとっての最大の違いは、.FindAllが.Net 2.0でも利用できることです。 .Net 3.5でプログラムを作成する余裕が常にあるとは限らないため、.Netジェネリックコレクションの「ネイティブ」メソッドを思い出そうとします。
LINQを使用できなかったため、既に利用可能なListメソッドを自分で実装したことが何度かありました。
この場合に便利だと思うのは、VS2008を使用して、私はcan型推論とラムダ構文を使用することです。これらは、フレームワーク機能ではなくコンパイラ機能です。これは、これを書くことができ、.NET 2.0内にとどまることができることを意味します。
var myOddNums = myNums.FindAll(n => n%2==1);
ただし、LINQを使用できる場合は、遅延実行と即時実行の違いを維持することが重要です。
正しく思い出せば、主な違い(実装されているものに加えて:IEnumerable<T>
vs. List<T>
)は、Where
が遅延実行を実装することです。この場合、実際には必要になるまで検索を実行しません。たとえば、foreachループで使用します。 FindAll
は即時実行メソッドです。
80Kのオブジェクトのリストでいくつかのテストを行ったところ、Find()
でWhere
を使用するよりもFirstOrDefault()
が最大1000%高速になることがわかりました。各呼び出しの前後にタイマーをテストするまで、私はそれを知りませんでした。時々それは同じ時間であり、他の時間はより高速でした。