为什么使用IQueryable代替IEnumerable与MEF目录?

时间:2012-03-04 18:47:50

标签: mef iqueryable

为什么目录通过IQueryable公开部件而不仅仅是IEnumerable。我一直在考虑它,但我不明白它们是如何(或者如果)实际使用接口提供的任何IQueryable服务。

1 个答案:

答案 0 :(得分:4)

因为它允许实现不必扫描每个查询的所有可用部分(O(N)操作)。

举一个具体的例子,考虑以下查询,该查询可能类似于MEF在内部查找具有正确合同的导出的内容:

var matches = catalog.Parts
    .Where(part => part.ExportDefinitions.Any(
        export => export.ContractName == "foo"));

IQueryProvider的目录实现可以将生成的表达式树识别为“给我输出合同的部分'foo'”,然后使用'foo'作为键从字典中检索它们,O( 1)操作 - 而不是实际枚举所有部分并执行传递给.Where的lambda,就像IEnumerable的情况一样。

编辑:我上面的示例并不是很好,因为已经有一个专门用于此案例的GetExports方法;没有必要像这样查询Parts属性。也许更好的例子涉及export.Metadata

相关问题