在 VB.Net 中迭代二维数组

ntt*_*lor 6 .net arrays iteration multidimensional-array

我很惊讶(也很害怕)以下代码可以在 Vb.Net 中运行

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

For Each s As String In test2DArr
  MsgBox(s)
Next
Run Code Online (Sandbox Code Playgroud)

运行时,会弹出四个消息框,显示“A”、“B”、“C”和“D”。

换句话说,它的行为与以下完全相同:

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

For Each s As String In test1DArr
  MsgBox(s)
Next
Run Code Online (Sandbox Code Playgroud)

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

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

For Each arr As String(,) In test2DArr
  MsgBox(arr(0) & ", " & arr(1))
Next
Run Code Online (Sandbox Code Playgroud)

并应生成两个消息框:“A,B”和“C,D”,但编译器坚持认为迭代二维数组会生成字符串序列,而不是字符串数组序列。

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

Kon*_*lph 4

\n

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

\n
\n\n

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

\n\n

这意味着数组的类型始终是 strings\xe2\x80\x9d 的 \xe2\x80\x9carray,因此它始终实现接口IEnumerable(Of String)。这解释了为什么您的第二个代码无法工作:为了使其工作,数组的类型必须不同。

\n

  • 哇。这是极其蹩脚的。另一方面,你的回答非常棒。谢谢你,也谢谢你让我了解锯齿状数组,这是我在 .Net 中从未做过的。他们为这个问题提供了一个更丑陋但仍然有用的解决方案。 (2认同)