web-dev-qa-db-ja.com

LINQ、Where()vs FindAll()

誰かがLINQ関数のWhere(..)とFindAll(..)の違いを説明できますか?どちらも同じことをしているようです...

112
Grant

FindAll()は_List<T>_型の関数であり、WhereのようなLINQ拡張メソッドではありません。 LINQ拡張メソッドは、IEnumerableを実装するすべての型で機能しますが、FindAllは_List<T>_インスタンス(またはもちろん、それを継承するクラスのインスタンス)でのみ使用できます。

また、実際の目的も異なります。 Whereは、オブジェクトが列挙されたときにオンデマンドで実行されるIEnumerableのインスタンスを返します。 FindAllは、要求された要素を含む新しい_List<T>_を返します。 FindAllは、IEnumerableのインスタンスでWhere(...).ToList()を呼び出すようなものです。

189
Adam Robinson

私にとっての最大の違いは、.FindAllが.Net 2.0でも利用できることです。 .Net 3.5でプログラムを作成する余裕が常にあるとは限らないため、.Netジェネリックコレクションの「ネイティブ」メソッドを思い出そうとします。

LINQを使用できなかったため、既に利用可能なListメソッドを自分で実装したことが何度かありました。

この場合に便利だと思うのは、VS2008を使用して、私はcan型推論とラムダ構文を使用することです。これらは、フレームワーク機能ではなくコンパイラ機能です。これは、これを書くことができ、.NET 2.0内にとどまることができることを意味します。

var myOddNums = myNums.FindAll(n => n%2==1);

ただし、LINQを使用できる場合は、遅延実行と即時実行の違いを維持することが重要です。

10
cfern

正しく思い出せば、主な違い(実装されているものに加えて:IEnumerable<T> vs. List<T>)は、Whereが遅延実行を実装することです。この場合、実際には必要になるまで検索を実行しません。たとえば、foreachループで使用します。 FindAllは即時実行メソッドです。

6
WayneC

80Kのオブジェクトのリストでいくつかのテストを行ったところ、Find()Whereを使用するよりもFirstOrDefault()が最大1000%高速になることがわかりました。各呼び出しの前後にタイマーをテストするまで、私はそれを知りませんでした。時々それは同じ時間であり、他の時間はより高速でした。

3
digiben