Dav*_*len 3 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- 这次通话的性能如何?因为替代方案是我必须在性能影响较小的地方施放 - 但这也是我们放弃一切知道它的类型的情况.
两件小事:
在枚举器中产生每个项目有一个小但可衡量的开销.如果你需要关心这个,因为你处于一个非常紧密的内循环中,你最好直接在列表上使用for循环进行迭代.很可能这没关系.
因为结果已经IEnumerable<BaseNode>并且已经通过屈服枚举函数进行过滤,所以对Count()或ElementAt()等方法的后续调用将不会利用列表的LINQ实现中的优化.除非经常使用这些扩展方法并且具有大量元素,否则这也不太可能成为问题.
你见过Cast<T>()Linq运营商吗?它应该比性能更高效OfType<T>().
基本上有一个条件是运行 OfType<T>()
if (item is T) {
yield return (T)item;
}
Run Code Online (Sandbox Code Playgroud)
与之相反Cast<T>():
yield return (T)item;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2579 次 |
| 最近记录: |