LINQ、Where()とFindAll()


回答:


202

FindAll()List<T>型の関数であり、のようなLINQ拡張メソッドではありませんWhere。LINQの拡張メソッドは、任意のタイプその実装に取り組むIEnumerable一方、FindAllのみで使用することができList<T>インスタンス(またはクラスのインスタンスその継承もちろん、それから)。

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


20
はい、findallの遅延バージョンはどこにありますか
ピエールテン09

2
code.msdn.microsoft.com/LINQ-Query-Execution-ce0d3b95は、遅延(遅延)と即時実行の違いを説明しています。基本的に、場合によっては、リスト全体が必要ない場合があります。何かが発生するまでアイテムをループしてから停止することができます。ここでレイジーが役に立ちますが、実装によっては、予測できない結果が生じる可能性があります(すべてリンクで説明されています)。お役に立てれば。
nurchi 2014

10

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

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

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

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

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


6

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


3

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


5
コレクションにもアクセスしてみましたか?Enumerable.Where()は遅延実行を使用し、コレクションにアクセスする前に評価されないため、実際に高速であるかどうかの誤った概念につながる可能性があります。それでも、ほとんどの場合、通常は静的コレクション(Type <T>やArray <T>など)ではなく列挙型を使用する方が高速です。
Sebastian JobBjørnagerJensen 2014

質問はFindAllについてです。FindがWhere(すべての値を取得)よりも速くなり、FirstOrDefaultを取得することは明らかです
Vivek MVK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.