c# - List.OfType<> 的性能影响是什么,其中整个列表都是该类型?

标签 c# linq generics covariance

我有一个架构,我们将数据节点作为 IEnumerable<BaseNode> 传递.一切都很好,但在每个子类中,我们希望将它们存储为 List<AnotherNode>因为该类中的所有内容都创建并使用了 AnotherNode对象(我们有大约 15 个不同的子类)。

使用更强类型列表的一个地方不起作用是返回类型 IEnumerable<BaseNode> 的根类方法。由于 .net 3.5 中的协方差限制,无法返回。 (我们现在必须继续使用 .net 3.5。)

但是如果我有 List<AnotherNode> data;并返回 data.OfType<BaseNode>(); - 效果很好。所以这是我的问题。

因为所有数据的类型都是 BaseNode - 这个电话的性能影响是什么?因为替代方案是我必须在性能影响较小的地方进行转换 - 但在这种情况下,我们会放弃一切,知道它的类型。

最佳答案

两件小事:

  1. 生成枚举器中的每个项目都会产生少量但可衡量的开销。如果您因为处于非常紧密的内部循环中而需要关心这一点,那么实际上最好直接在列表上使用 for 循环进行迭代。这很可能无关紧要。

  2. 因为结果是IEnumerable<BaseNode>并且已经通过生成枚举函数​​进行了过滤,后续对 Count() 或 ElementAt() 等方法的调用将不会利用列表的 LINQ 实现中的优化。这也不太可能成为问题,除非您经常使用这些扩展方法并且拥有大量元素。

关于c# - List.OfType<> 的性能影响是什么,其中整个列表都是该类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195478/

相关文章:

c# - 如何在c#中实现泛型多态?

java - 如何用通用方法找出最小值?

C#表面2数据源

c# - 将权限/身份验证复制到子线程...?

c# - 将 javascript 与 asp.net 连接起来

c# - 如何在 Enumerable.Distinct() 中使用 lambda 表达式

c# - 如何使 EF 核心将自定义排序转换为纯 'When Then' 而不是分层

c# - 无法向 Unity 和 Entity Framework 注册 DbConnection

c# - 使用 linq 从动态 sql 查询中检索和打印数据

java - 从接口(interface)实现泛型方法而不困惑?