我正在寻找一种克隆 IEnumerable<T>
参数的简单方法,以供以后引用。 LINQ的 ToArray
扩展方法似乎是一种不错的简洁方法。
但是,我不确定是否总是保证返回一个新的数组实例。几种LINQ方法将检查可枚举的实际类型,并在可能的情况下检查快捷方式。例如 Count()
将查看该方法是否实现 ICollection<T>
,如果是,将直接读取其 Count
属性;它仅在需要时才迭代集合。
考虑到实际可行的短路思维方式,看来,如果我在已经是数组的对象上调用ToArray()
,ToArray()
可能会短路并仅返回相同的数组实例。从技术上讲,这将满足ToArray
方法的要求。
通过快速测试,看来在.NET 4.0中,在数组上调用ToArray()
确实会返回一个新实例。我的问题是,我可以依靠它吗? 是否可以确保ToArray
始终返回新实例,即使在Silverlight和.NET Framework的将来版本中也是如此?在这一点上有没有清楚的文档?
最佳答案
是的,ToArray
将始终返回一个新数组-将其更改为返回现有值将是一个令人震惊的更改,而我完全确信.NET团队不会这样做。能够依靠是很重要的。可惜的是没有记录:(
LINQ to Objects中有许多微妙的行为,可能不值得依赖,但是在这种情况下,它的行为如此之多,我对其更改绝对感到惊讶。
短路在不影响性能的情况下非常好,但是通常LINQ to Objects仅在有效情况下进行优化才是不错的选择。您可能需要查看涵盖优化的Edulinq系列文章中的two posts。
关于.net - 我可以依靠LINQ ToArray()始终返回新实例吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6074275/