为什么目录通过 IQueryable 而不仅仅是 IEnumerable 公开部分。我一直在考虑这个问题,但我不明白他们如何(或是否)实际使用接口(interface)提供的任何 IQueryable 服务。
最佳答案
因为它允许实现不必为每个查询扫描所有可用部分(O(N) 操作)。
为了给出一个具体的示例,请考虑以下查询,该查询可能类似于 MEF 在内部执行的查找具有正确契约(Contract)的导出的操作:
var matches = catalog.Parts
.Where(part => part.ExportDefinitions.Any(
export => export.ContractName == "foo"));
IQueryProvider
的目录实现可以将生成的表达式树识别为“给我导出合约 'foo' 的部分”,然后使用 'foo' 作为键从字典中检索它们, O(1) 操作 - 而不是像 IEnumerable
那样实际枚举所有部分并执行传递给 .Where
的 lambda。
编辑:我上面的例子并不是一个很好的例子,因为已经有一个 GetExports专门针对这种情况的方法;没有必要像这样查询 Parts
属性。也许更好的例子是 export.Metadata
。
关于mef - 为什么 MEF 目录使用 IQueryable 而不是 IEnumerable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9557772/