【问题标题】:Iterating Jagged Arrays迭代锯齿状数组
【发布时间】:2013-06-21 08:21:33
【问题描述】:

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

【问题讨论】:

  • 递归是唯一的方法,而不是循环。
  • ja72,我不确定你的意思?你能详细说明一下吗?
  • 查看@jods 解决方案。这就是我的意思。

标签: vb.net jagged-arrays


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2015-09-23
    • 2015-07-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多