3

我工作的代码库在几个地方有类似于以下的代码:

Dim i As Integer
Dim ints As New ArrayList
ints.Add(1)

'... lets say we add more Integers

For each i in ints.ToArray(GetType(Integer))
'Do something
Next

我想知道.ToArray(GetType(Integer))在运行时省略几乎相同的结果会带来什么好处。那就是呼唤For Each i In ints。我看到的唯一区别是,如果 Integer 以外的某些类型出现ArrayList在生成的错误消息中,如果您不调用.ToArray()

为什么我要ToArray(type)在一个已经指定类型ArrayList的循环中使用?For Each

4

5 回答 5

5

如果我将在已经指定类型的情况下执行 For Each 循环,我为什么要在 ArrayList 上使用 ToArray(type)?

一般来说,您可能不想这样做。调用ToArray()实际上会创建一个新的值数组

如果您的循环要修改ArrayList. 您不能在枚举它们时修改大多数集合,因此您会遇到异常。通过添加ToArray调用,您将枚举集合的副本(作为数组),因此您可以修改原始集合。

请注意,一般来说,如果是这种情况,我会使用ToList(),而不是ToArray(),因为它通常更有效(通常少一个内存分配)。我还建议您使用List(Of Integer)而不是ArrayList任何新代码,因为您可以获得类型安全。

于 2013-05-16T17:46:54.140 回答
2

您不需要在循环中调用ToArrayan :已声明为,因此将自动为您执行类型转换。ArrayListFor eachiInteger

有时您可能需要在查询结果上调用数组以将数据复制到内存中。它为您提供优势的一个地方是将数据库查询的结果复制到内存中,因为您可以更快地关闭连接。此外,ToList在查询将引用修改后的变量或IEnumerable多次生成代价高昂的情况下,调用可以帮助您。

于 2013-05-16T17:48:34.980 回答
1

.ToArray()您可能会调用该 ArrayList的原因有两个:

  1. 所以你不需要在 ArrayList 中强制转换项目。该数组是强类型的,因此首先将它们放在那里意味着编译器知道数组列表中的所有内容都是整数。
  2. 因此,您可以将 arraylist 传递给需要数组作为参数的方法。
于 2013-05-16T17:53:28.570 回答
1

旧代码库中的防御性编程。大概他们当时没有可用的“List(Of Integer)”。您希望在“For Each”语句(如果“ints”包含非整数)而不是稍后在循环中失败有几个原因:

  1. 显然,您不想浪费时间。循环内的操作可能需要很长时间。最好在开始循环之前失败,而不是在迭代 99999 时失败。
  2. 您可能希望对整个 ArrayList 执行“全部或全部”操作。
于 2013-05-16T18:23:46.583 回答
1

在您的情况下,更改为此代码,您不需要:

Dim i As Integer
Dim ints As New Generic.List(Of Integer)
ints.Add(1)
'... lets say we add more Integers

For each i in ints
'Do something
Next

ToArray在处理 LINQ 结果时会派上用场。如果您的集合大小是可测量的,则可以执行ToArray. 大多数较旧的 .NET 函数更喜欢使用数组。很好的例子是String.Join。因此,您可能需要经常使用它来实现调用之间的类型兼容性。这样做的另一个原因是数组更容易在调试器中检查。

无论如何,您应该始终证明需要。如果您的目标是严格类型,最好使用为此目的创建的类型,例如上面的Generic.List(Of T).

于 2013-05-16T19:49:29.087 回答