List.OfType<>整个列表都是这种类型

本文关键字:种类 类型 列表 OfType List | 更新日期: 2023-09-27 18:06:44

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

使用强类型列表不起作用的一个地方是根类方法,它返回类型IEnumerable<BaseNode>,并且具有。net 3.5中的协方差限制,无法返回。(我们现在必须停留在。net 3.5。)

但是如果我有List<AnotherNode> data;并返回data.OfType<BaseNode>(); -那就可以了。这是我的问题。

由于所有的数据类型都是BaseNode -这个调用的性能影响是什么?因为另一种选择是,我必须在对性能影响很小的地方进行强制转换-但这也是一种情况,我们放弃了知道它的类型的所有内容

List.OfType<>整个列表都是这种类型

两件小事:

  1. 与产生枚举数中的每个项相关的开销很小,但可以测量。如果你需要关心这个,因为你在一个非常紧密的内循环中,你最好直接在列表上迭代一个for循环。

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

您见过Cast<T>() Linq操作符吗?它应该比OfType<T>()更高效。

基本上,OfType<T>()

有一个条件
if (item is T) {
    yield return (T)item;
}

对比Cast<T>()的做法:

yield return (T)item;