2008-09-08 8 views
2

Cela m'a rendu fou pendant quelques jours. Pourquoi ce qui suit ne fonctionne pas?Comment effectuer une itération d'un tableau en dents de scie?

Dim arr(3, 3) As Integer 

    For y As Integer = 0 To arr.GetLength(0) - 1 
     For x As Integer = 0 To arr.GetLength(y) - 1 
      arr(y, x) = y + x 
     Next 
    Next 

En outre, si le tableau ressemblait à ce lieu?

{ {1, 2, 3}, 
    {4, 5, 6, 7, 8, 9, 9, 9}, 
    {5, 4, 3, 2} 
} 

Répondre

5

Ok, ce dont vous avez vraiment besoin, c'est d'un "tableau dentelé". Cela vous permettra d'avoir un "tableau qui contient d'autres tableaux de longueurs variables".

Dim arr As Integer()() = {New Integer() {1, 2, 3}, New Integer() {4, 5, 6, 7, 8, 9, 9, 9}, New Integer() {5, 4, 3, 2}} 

    For x = 0 To arr.GetUpperBound(0) 
     Console.WriteLine("Row " & x & " has " & arr(x).GetUpperBound(0) & " columns") 
     For y = 0 To arr(x).GetUpperBound(0) 
      Console.WriteLine("(" & x & "," & y & ") = " & arr(x)(y)) 
     Next 
    Next 

Sortie:

Row 0 has 2 columns 
(0,0) = 1 
(0,1) = 2 
(0,2) = 3 
Row 1 has 7 columns 
(1,0) = 4 
(1,1) = 5 
(1,2) = 6 
(1,3) = 7 
(1,4) = 8 
(1,5) = 9 
(1,6) = 9 
(1,7) = 9 
Row 2 has 3 columns 
(2,0) = 5 
(2,1) = 4 
(2,2) = 3 
(2,3) = 2 
4

arr.GetLength(y)

devrait être

arr.GetLength(1)

+0

Argh. Vous me battez;) –

+0

+ 1 Nice One :) –

7

Parce qu'il n'y a pas de dimension '2' ou '3'. Devrait être .GetLength (1) au lieu de .GetLength (y)

Également: dans VB.Net les déclarations de tableau fonctionnent un peu différemment. L'indice que vous spécifiez dans la déclaration est le dernier index, pas le nombre d'éléments créés comme avec C# ou C++. Mais le tableau est toujours indexé à 0 comme C# ou C++, au lieu de 1-indexé comme VB6. Cela signifie que si vous passez à VB.Net à partir d'une langue différente, vos instincts de tableau sont probablement faux, peu importe la langue. Dans VB.Net, Dim arr (3,3) As Integer crée en fait un tableau 4x4.

1

Eh bien si j'avais un tableau qui ressemblait à ce

{ {1, 2, 3}, 
    {4, 5, 6, 7, 8, 9, 9, 9}, 
    {5, 4, 3, 2} 
} 

Comment GetLength (1) connaissent encore la longueur de chaque ligne?


Fondamentalement, ce que je veux est .... un moyen de trouver le nombre d'éléments dans une ligne donnée.

+0

Ce n'est pas un tableau (3,3) comme votre question d'origine non plus. –

-1

Votre déclaration: DIM arr(3,3) As Integer précise allready qu'il ya 3 éléments dans une ligne donnée (ou 4, je ne suis pas sûr de VB)

Vous pouvez essayer:

Dim arr(3) as Integer() 

Vous devriez alors pouvoir faire:

arr(n).Length 

Pour trouver la longueur de la ligne n.

Je suis un peu rouillé sur VB6 et n'a jamais appris VB.NET, mais cela devrait vous donner un tableau «dentelé». Consultez la documentation msdn sur les tableaux multidimensionnels.

0
Dim arr(3, 3) As Integer 
Dim y As Integer 
Dim x As Integer 

For x = 0 To arr.Rank - 1 
    For y = 0 To arr.GetLength(x) - 2 
     arr(x, y) = x + y 
    Next 
Next 

Le code ci-dessus a fonctionné pour moi.

Modifier, le code se sent sale cependant. Je me demande ce que vous essayez d'accomplir?

0

Ce code en C# est d'obtenir toutes les combinaisons d'éléments dans un tableau en dents de scie:

static void Main(string[] args) 
    { 
     bool exit = false; 
     int[] indices = new int[3] { 0, 0, 0 }; 
     string[][] vectores = new string[3][]; 

     vectores[0] = new string[] { "A", "B", "C" }; 
     vectores[1] = new string[] { "A", "B" }; 
     vectores[2] = new string[] { "B", "D", "E", "F" }; 

     string[] item; 
     int[] tamaños = new int[3]{vectores[0].GetUpperBound(0), 
      vectores[1].GetUpperBound(0), 
      vectores[2].GetUpperBound(0)}; 

     while (!exit) 
     { 
      item = new string[]{ vectores[0][indices[0]], 
        vectores[1][indices[1]], 
        vectores[2][indices[2]]}; 

      Console.WriteLine("[{0},{1},{2}]={3}{4}{5}", indices[0], indices[1], indices[2], item[0], item[1], item[2]); 
      GetVector(tamaños, ref indices, ref exit); 
     } 
     Console.ReadKey(); 
    } 

    public static void GetVector(int[] tamaños, ref int[] indices, ref bool exit) 
    { 
     for (int i = tamaños.GetUpperBound(0); i >= 0; i--) 
     { 
      if (tamaños[i] > indices[i]) 
      { 
       indices[i]++; 
       break; 
      } 
      else 
      { 
       //ULTIMO ITEM EN EL ARRAY, VALIDAR LAS OTRAS DIMENSIONES SI YA ESTA EN EL ULTIMO ITEM 
       if (!ValidateIndexes(tamaños, indices)) 
        indices[i] = 0; 
       else 
       { 
        exit = true; 
        break; 
       } 
      } 
     } 
    } 

    public static bool ValidateIndexes(int[] tamaños, int[] indices) 
    { 
     for (int i = 0; i < tamaños.Length; i++) 
     { 
      if (tamaños[i] != indices[i]) 
       return false; 
     } 
     return true; 
    } 

La sortie ressemble [0,0, 0] = AAB [0,0,1] = AAD [0,0,2] = AAE [0,0,3] = AAF [0,1,0] = ABB [0 , 1,1] = ABD [0,1,2] = ABE [0,1,3] = ABF [1,0,0] = BAB [1,0,1] = BAD [1 , 0,2] = BAE [1,0,3] = BAF [1,1,0] = BBB [1,1,1] = BBD [1,1,2] = BBE [1 , 1,3] = BBF [2,0,0] = CAB [2,0,1] = CAD [2,0,2] = CAE [2,0,3] = CAF [2 , 1,0] = CBB [2,1,1] = CBD [2,1,2] = CBE [2,1,3] = CBF

Questions connexes