Frage

Das macht mich seit ein paar Tagen wahnsinnig.Warum funktioniert Folgendes nicht?

    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

Und was wäre, wenn das Array stattdessen so aussehen würde?

{ {1, 2, 3},
  {4, 5, 6, 7, 8, 9, 9, 9},
  {5, 4, 3, 2}
}
War es hilfreich?

Lösung

Ok, was Sie also wirklich brauchen, ist ein „gezacktes Array“.Dadurch erhalten Sie ein „Array, das andere Arrays unterschiedlicher Länge enthält“.

  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

Ausgabe:

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

Andere Tipps

Weil es keine „2“- oder „3“-Dimension gibt.Sollte .GetLength(1) statt .GetLength(y) sein.

Auch:In VB.Net funktionieren Array-Deklarationen etwas anders.Der Index, den Sie in der Deklaration angeben, ist der letzte Index und nicht die Anzahl der erstellten Elemente wie bei C# oder C++.Aber das Array ist immer noch 0-indiziert wie C# oder C++, statt 1-indiziert wie VB6.Das heißt, wenn Sie von einer anderen Sprache zu VB.Net wechseln, sind Ihre Array-Instinkte wahrscheinlich falsch, egal um welche Sprache es sich handelt.In VB.Net, Dim arr(3,3) als Ganzzahl schafft tatsächlich eine 4x4 Array.

arr.GetLength(y)

sollte sein

arr.GetLength(1)

Was wäre, wenn ich ein Array hätte, das so aussieht?

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

Wie würde GetLength(1) trotzdem die Länge jeder Zeile kennen?


Im Grunde möchte ich Folgendes: eine Möglichkeit, die Anzahl der Elemente in einer bestimmten Zeile zu ermitteln.

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

Der obige Code hat bei mir funktioniert.

Bearbeiten, der Code fühlt sich allerdings schmutzig an.Ich frage mich, was Sie erreichen wollen?

Dieser Code in C# dient dazu, alle Kombinationen von Elementen in einem gezackten Array abzurufen:

    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;
    }

Die Ausgabe sieht aus wie [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] = schlecht [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

Ihre Erklärung: DIM arr(3,3) As Integer Gibt bereits an, dass es in jeder Zeile 3 Elemente gibt (oder 4, bei VB bin ich mir nicht so sicher)

Du könntest es versuchen:

Dim arr(3) as Integer()

Sie sollten dann in der Lage sein:

arr(n).Length

Um die Länge der Zeile n zu ermitteln.

Ich bin mit VB6 etwas vertraut und habe VB.NET nie gelernt, aber das sollte ein „gezacktes“ Array ergeben.Schauen Sie sich die MSDN-Dokumentation zu mehrdimensionalen Arrays an.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top