2013-06-24 95 views
0

我正在構建一個類DLL,它將接受矩形和參差不齊的數組(一維,二維,三維等或鋸齒狀數組,鋸齒狀數組的鋸齒狀數組等)。 A For Each Item in RectangularArray負責矩形陣列,但鋸齒陣列呢?使用For Each Item in JaggedArray循環,項目因爲數組。 A For I As Integer = 0 to JaggedArray.GetUpperBound(0)適用於交錯數組,但如果輸入是鋸齒狀數組()()()或()()()()或()()()()()的鋸齒陣列,等等等等?迭代Jagged數組

**基於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 

,但它與「無法投類型的對象「系統崩潰.Char'鍵入'System.Collections.IEnumerable'。「在For Each x In Flatten(ListOfTables)

這對我來說是全新的,任何想法我做錯了什麼?它返回的第一個條目是「c」c,但我希望它返回完整的字符串或「constraintenode」。

+0

遞歸是做到這一點的唯一途徑,而不是與循環。 – ja72

+0

ja72,我不確定你的意思?你能詳細說明嗎? – JoeB

+0

看@jod解決方案。這就是我的意思。 – ja72

回答

1

如果您在編碼時知道鋸齒陣列有多深,您可以簡單地使用嵌套循環。請參閱漢斯帕斯坦的答案爲例。

如果你不這樣做,你可以依靠一個類型檢查和遞歸。有各種解決方案,這是一個簡單的解決方案。對不起,我正在編寫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