2012-03-04 8 views

答えて

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です。

+0

IQueryProviderの実装によって、実際には、そのような最適化が行われます。 –

+0

@ジョン:MEF *が実際にこのようなことをしているのかどうかはわかりませんが、インターフェイスだけでそのような実装が可能です。 'ComposablePartCatalog'から派生して、独自のカタログを作成することができます。 –

関連する問題