Vb.net 迭代交错数组

Vb.net 迭代交错数组,vb.net,jagged-arrays,Vb.net,Jagged Arrays,我正在构建一个类DLL,它将同时接受矩形和锯齿状数组(1D、2D、3D等),或者锯齿状数组、锯齿状数组的锯齿状数组等。矩形阵列中每个项目的处理矩形阵列,但是锯齿阵列呢?对于JaggedArray循环中的每个项,都有一个,因为该项是一个数组。对于锯齿状数组,I As Integer=0到JaggedArray.GetUpperBound(0)可以正常工作,但是如果输入是锯齿状数组的锯齿状数组()(),或()(),或()(),等等,该怎么办 **编辑 根据Jods的回答,我得出: Public Sh

我正在构建一个类DLL,它将同时接受矩形和锯齿状数组(1D、2D、3D等),或者锯齿状数组、锯齿状数组的锯齿状数组等。矩形阵列中每个项目的
处理矩形阵列,但是锯齿阵列呢?对于JaggedArray
循环中的每个项,都有一个
,因为该项是一个数组。对于锯齿状数组,I As Integer=0到JaggedArray.GetUpperBound(0)
可以正常工作,但是如果输入是锯齿状数组的锯齿状数组()(),或()(),或()(),等等,该怎么办

**编辑 根据Jods的回答,我得出:

Public Shared Function Flatten(source As IEnumerable(Of Object)) As Object
    For Each item As Object In source
        If TypeOf item Is IEnumerable(Of Object) Then
            For Each item2 As Object In Flatten(item)
                Return item2
            Next
        Else
            Return item
        End If
    Next
End Function

但是,对于扁平化(ListOfTables)中的每个x,在
上出现了一个“无法将'System.Char'类型的对象强制转换为'System.Collections.IEnumerable'


这对我来说是全新的,你知道我做错了什么吗?它返回的第一个条目是“c”c,但我希望它返回完整的字符串或“constraintode”。

如果您在编码时知道锯齿数组的深度,您可以简单地使用嵌套循环。参见Hans Passant的答案,以了解这方面的示例

如果没有,则可以依赖类型检查和递归。有多种解决方案,这里有一个简单的解决方案。抱歉,我正在编写C代码,因为没有编译器,我的VB.NET有点不稳定;我相信你会明白这一点,并很容易地转换代码

public static IEnumerable Flatten(this IEnumerable source)
{
   foreach (object item in source)
   {
     if (item is IEnumerable)
     {
       foreach (object item2 in Flatten((IEnumerable)item))
         yield return item2;
     }
     else
       yield return item;
   }
}
这段代码非常通用,因为它可以处理任何类型的IEnumerable。您可以在检查时更加严格,只接受特定类型的数组。如果您希望数组包含列表或其他不希望展平的IEnumerable,这可能很重要

现在只需迭代:

For Each x In Flatten(myArray)
  ' Do something with x
Next For

递归是唯一的方法,而不是循环。ja72,我不知道你的意思是什么?你能详细说明一下吗?看看@jods解决方案。这就是我的意思。
For Each x In Flatten(myArray)
  ' Do something with x
Next For