mef - 为什么 MEF 目录使用 IQueryable 而不是 IEnumerable?

标签 mef iqueryable

为什么目录通过 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/

相关文章:

c# - 使用 MEF 加载多个插件实例

directory - MEF 容器使用目录目录自动更新

.net - 在运行时用 .NET 替换程序集

mvvm - 如何使用构造函数依赖注入(inject)将模型从集合提供给他们的 ViewModel?

wpf - MEF 组件上的 ShowDialog 仅工作一次

c# - 存储库/IQueryable/查询对象

c# - 这两个 LINQtoSQL 语句有什么区别?

.net - 用简短的语言解释为什么需要 IQueryable<T>

c# - 如何在 C# VSTO 3 的 word 文档中验证具有给定 ID 的表是否存在

c# - 解决 LINQ to Entities 无法识别该方法的方法?