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