0

長方形配列とギザギザ配列 (1D、2D、3D など、またはギザギザ配列、ギザギザ配列のギザギザ配列など) の両方を受け入れるクラス DLL を構築しています。長方形配列はAFor Each Item in RectangularArrayが処理しますが、ギザギザ配列はどうでしょうか。ループ付き、For Each Item in JaggedArray配列なのでItem。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| が配列に含まれると予想される場合に重要です。

繰り返すだけです:

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