【问题标题】:iterating through 2-d array in VB.Net在VB.Net中遍历二维数组
【发布时间】:2011-08-24 15:45:22
【问题描述】:

我对以下代码在 Vb.Net 中工作感到惊讶(和恐惧)

Dim test2DArr As String(,) = {{"A", "B"}, {"C", "D"}}

For Each s As String In test2DArr
  MsgBox(s)
Next

运行时,会弹出四个消息框,分别显示“A”、“B”、“C”,然后是“D”。

换句话说,它的行为与:

Dim test1DArr As String() = {"A", "B", "C", "D"}

For Each s As String In test1DArr
  MsgBox(s)
Next

有人可以解释这个“功能”吗?我需要在这里强加一些显然不受支持的结构。上面的第一个代码示例应该是:

Dim test2DArr As String(,) = {{"A", "B"}, {"C", "D"}}

For Each arr As String(,) In test2DArr
  MsgBox(arr(0) & ", " & arr(1))
Next

并且应该产生两个消息框:“A,B”和“C,D”,但是编译器坚持遍历二维数组会产生字符串序列,而不是字符串数组序列。

是我做错了什么还是 .Net 的二维数组实现真的那么脆弱?

【问题讨论】:

  • +1 这对我来说绝对是迷人的。如果其他读者想亲自体验,我设置了this situation up here

标签: .net arrays multidimensional-array iteration


【解决方案1】:

.Net 的二维数组实现真的那么脆弱吗?

是的。 .NET 从未真正支持多维数组。我不确定它们为什么存在(与数组的数组相反,即锯齿状数组:String()())。无论如何,所有支持都是针对一维数组的特殊情况量身定制的。无论维度如何,数组的框架类型始终相同,并且接口实现(在本例中为 IEnumerable(Of T))是针对此常见用例量身定制的。

这意味着数组的类型始终是“字符串数组”,因此它始终实现接口IEnumerable(Of String)。这解释了为什么您的第二个代码不能工作:为了让它工作,数组的类型必须不同。

【讨论】:

  • 哇。那是极其蹩脚的。另一方面,您的回答很棒。谢谢你,也感谢你把我带到锯齿状数组上,这是我在 .Net 中从未做过的。它们为这个问题提供了一个更丑陋但仍然有用的解决方案。
猜你喜欢
  • 2016-09-04
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
相关资源
最近更新 更多