0

我正在构建一个类 DLL,它将接受矩形和锯齿状数组(1D、2D、3D 等或锯齿状数组、锯齿状数组的锯齿状数组等)。AFor Each Item in RectangularArray负责矩形阵列,但是锯齿阵列呢?使用For Each Item in JaggedArray循环,Item 因为是 Array。AFor I As Integer = 0 to 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

For Each x In Flatten(ListOfTables)
    If Not Tables.Contains(x) Then Tables.Add(x)
Next

但它因“无法将'System.Char'类型的对象转换为'System.Collections.IEnumerable'类型而崩溃。” 上For Each x In Flatten(ListOfTables)

这对我来说是全新的,任何想法我做错了什么?它返回的第一个条目是“c”c,但我希望它返回完整的字符串或“constraintenode”。

4

1 回答 1

1

如果您在编码时知道锯齿状数组的深度,则可以简单地使用嵌套循环。有关示例,请参见 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|s,这可能很重要。

现在只需迭代:

For Each x In Flatten(myArray)
  ' Do something with x
Next For
于 2013-06-24T18:20:04.933 回答