カタログがIEnumerableだけでなく、IQueryableを介して部品を公開するのはなぜですか。私はそれについて考えてきましたが、インタフェースが提供するIQueryableサービスをどのように実際に使用するのかを理解していません。MEFカタログでIEnumerableの代わりにIQueryableが使用されるのはなぜですか?
2
A
答えて
4
クエリごとにすべての利用可能な部分(O(N)操作)をスキャンする必要がない実装が可能になるためです。
var matches = catalog.Parts
.Where(part => part.ExportDefinitions.Any(
export => export.ContractName == "foo"));
IQueryProvider
のカタログの実装は、結果の式を認識できます、具体的な例を与えるMEFは、右契約に輸出を見つけるために、内部的に行い、何かのようになります。次のクエリを考慮することが
「foo」をキーとして「foo」を使って辞書から検索すると、実際にすべての部分を列挙して実行するのではなく、.Where
に渡されるラムダを実行しますIEnumerable
の場合と同様です。
編集:私の例は実際にはこの場合のために具体的にGetExportsメソッドが存在するため、実際には良いものではありません。そのようなParts
プロパティを照会する必要はありません。おそらく、より良い例はexport.Metadata
です。
関連する問題
- 1. なぜ使用されるビューの代わりに、SQL文
- 2. JavaがUTF-8の代わりに変更されたUTF-8を使用するのはなぜですか?
- 3. なぜ文中の他の場所でも値が使用されない場合、i ++の代わりに++ iを使用するのはなぜですか?
- 4. RELEASEの代わりにNDEBUGを使用するのはなぜですか?
- 5. リストの代わりにIEnumerableを使用すると、流暢なnhibernateが結果をキャッシュしないのです
- 6. なぜwindow.showModalDialogは推奨されていませんか?代わりに何を使用するのですか?
- 7. WCF/Silverlight:なぜクライアントの代わりにChannelFactoryを使用するのですか?
- 8. なぜRabbitMQの代わりにCeleryを使用するのですか?
- 9. なぜJavaの代わりにClojureを使用するのですか
- 10. catch(...)によってキャッチされる代わりに_CxxUnhandledExceptionFilterが呼び出されるのはなぜですか?
- 11. なぜAssembly.LoadFromの代わりにAssembly.LoadFileを使用しますか?
- 12. Scala:filterNotの代わりにremoveが使用されなくなりましたか?
- 13. イベントストア/ CQRSアーキテクチャでは、コマンドの代わりにイベントが格納されるのはなぜですか?
- 14. Xcode 4.2がNSAutoreleasePoolの代わりにmain.mで@autoreleasepoolを使用するのはなぜですか?
- 15. AndroidのLocale.getDefault()。getLanguage()で言語コードの代わりに表示名が返されるのはなぜですか?
- 16. this.objectNameの代わりにExt.getCmp( 'id')を使用しなければならないのはなぜですか?
- 17. JavaにNullReferenceExceptionの代わりにNullPointerExceptionがあるのはなぜですか?
- 18. ArrayListにsize()の代わりにgetSize()がないのはなぜですか?
- 19. Objective-Cデリゲートには、通常retainの代わりにassignプロパティが指定されるのはなぜですか?
- 20. Where句でIQueryableが実行されるのはなぜですか?
- 21. sympyが `__init__`の代わりに` __new__`をオーバーライドするのはなぜですか?
- 22. いつIEnumerable.GetEnumeratorがIEnumerableの代わりに呼び出されるのですか。<T> .GetEnumerator?
- 23. googleMap.setOnMyLocationChangeListenerの代わりに使用されなくなった
- 24. なぜVaadinでVerticalLayoutの代わりにFormLayoutを使用しますか?
- 25. xmlの代わりにIEで使用されるjavascriptアプリですか?
- 26. URL Hashが置き換えられる代わりに追加されるのはなぜですか?
- 27. HTMLに空白の代わりに四角形が表示されるのはなぜですか?
- 28. PHP 5がclassName()の代わりに__contruct()をコンストラクタとして使用するのはなぜですか?
- 29. DateTime to Unix時間が整数の代わりにdoubleを使用するのはなぜですか?
- 30. urllib.request.urlretrieveの代わりに使用するコマンドは何ですか?
IQueryProviderの実装によって、実際には、そのような最適化が行われます。 –
@ジョン:MEF *が実際にこのようなことをしているのかどうかはわかりませんが、インターフェイスだけでそのような実装が可能です。 'ComposablePartCatalog'から派生して、独自のカタログを作成することができます。 –