Pregunta

Esto me tiene volviendo loco desde hace unos días.¿Por qué no funciona lo siguiente?

    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

Además, ¿qué pasaría si la matriz se viera así?

{ {1, 2, 3},
  {4, 5, 6, 7, 8, 9, 9, 9},
  {5, 4, 3, 2}
}
¿Fue útil?

Solución

Bien, entonces lo que realmente necesitas es una "matriz irregular".Esto le permitirá tener una "matriz que contiene otras matrices de diferentes longitudes".

  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

Producción:

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

Otros consejos

Porque no existe una dimensión '2' o '3'.Debería ser .GetLength(1) en lugar de .GetLength(y)

También:en VB.Net, las declaraciones de matrices funcionan de manera un poco diferente.El subíndice que especifica en la declaración es el último índice, no la cantidad de elementos creados como con C# o C++.Pero la matriz todavía tiene un índice 0 como C# o C++, en lugar de un índice 1 como VB6.Eso significa que si pasa a VB.Net desde un idioma diferente, sus instintos de matriz probablemente estén equivocados, sin importar qué idioma sea.En VB.Net, Dim arr(3,3) como entero en realidad crea un 4x4 formación.

arr.GetLength(y)

debiera ser

arr.GetLength(1)

Bueno, ¿qué pasaría si tuviera una matriz que se viera así?

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

¿Cómo podría GetLength(1) saber la longitud de cada fila?


Básicamente lo que quiero es.... una forma de encontrar el número de elementos en cualquier fila dada.

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

El código anterior funcionó para mí.

Edite, aunque el código se siente sucio.Me pregunto ¿qué es lo que estás tratando de lograr?

Este código en C# es para obtener todas las combinaciones de elementos en una matriz irregular:

    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 salida se ve como [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] = malo [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

Su declaración: DIM arr(3,3) As Integer ya especifica que hay 3 elementos en cualquier fila determinada (o 4, no estoy tan seguro acerca de VB)

Tu podrías intentar:

Dim arr(3) as Integer()

Entonces deberías poder hacer:

arr(n).Length

Para encontrar la longitud de la fila n.

Estoy un poco oxidado con VB6 y nunca aprendí VB.NET, pero esto debería darte una matriz "irregular".Consulte la documentación de msdn sobre matrices multidimensionales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top