0

我有一些使用反向扩展方法的代码。

为了确保它不会反转原始列表,原始程序员使用 GetRange 创建一个新列表。

dim a = New List(of Thing)
... fill in a
dim b = a.GetRange(0, a.count)
b.reverse()

大概 GetRange 保证总是创建一个新对象。这也适用于 ToList 吗?

然后我可以写:

dim a = New List(of Thing)
... fill in a
dim b = a.ToList()
b.reverse()

那么优点是 a 的类型可以是 IEnumerable(of T) 并且它仍然可以工作。

我自己对此进行了测试,并且 b 始终是一个新对象。问题是这样的:

是否保证未来的实现将表现相同,或者这种行为是实现的意外?

一个明显的“优化”是如果它已经是一个列表,则返回对原始对象的引用,这当然意味着第二个版本将反转原始列表。

4

3 回答 3

1

基于这个来源,我会假设它确实如此,但如果 msdn 文章中提到的查询为空,那么它只会返回一个空列表。

鉴于您没有设法反驳这一点,您可能需要对此进行进一步研究以找到真正的答案。

于 2013-09-25T10:34:46.257 回答
1

我不明白这怎么可能只是一个实现细节。

IEnumerable<T>根本不必是一个列表。只是可以列举的东西。所以ToList()别无选择,只能遍历整个可枚举并创建一个包含所有结果的新列表。

我能想到的唯一警告是,如果他们在内部ToList专门检查输入是否为类型List<T>并仅返回对它的引用。

但这会破坏很多现有的代码,它永远不会发生。

于 2013-09-25T10:35:38.057 回答
1

从它的文档

从 IEnumerable 创建列表

这意味着一个新的实例。

您可以确保使用以下命令创建一个新列表:

dim b =New List(Of T)(input) inputIEnumerable(Of T) 在哪里

于 2013-09-25T10:41:02.273 回答