سؤال

لقد كان هذا يقودني إلى الجنون لبضعة أيام.لماذا لا يعمل التالي؟

    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

وأيضًا، ماذا لو بدت المصفوفة بهذا الشكل بدلاً من ذلك؟

{ {1, 2, 3},
  {4, 5, 6, 7, 8, 9, 9, 9},
  {5, 4, 3, 2}
}
هل كانت مفيدة؟

المحلول

حسنًا، ما تحتاجه حقًا هو "مصفوفة خشنة".سيسمح لك ذلك بالحصول على "مصفوفة تحتوي على مصفوفات أخرى ذات أطوال مختلفة".

  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

انتاج:

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

نصائح أخرى

لأنه لا يوجد بعد "2" أو "3".يجب أن يكون .GetLength(1) بدلاً من .GetLength(y)

أيضًا:تعمل إعلانات صفيف VB.Net بشكل مختلف قليلاً.الحرف المنخفض الذي تحدده في الإعلان هو الفهرس الأخير، وليس عدد العناصر التي تم إنشاؤها كما هو الحال مع C# أو C++.لكن المصفوفة لا تزال مفهرسة بـ 0 مثل C# أو C++، بدلاً من 1 مفهرسة مثل VB6.وهذا يعني أنه إذا انتقلت إلى VB.Net من لغة مختلفة، فمن المحتمل أن تكون غرائز المصفوفة الخاصة بك خاطئة، بغض النظر عن اللغة.في برنامج VB.Net، Dim arr(3,3) كعدد صحيح في الواقع يخلق 4x4 مجموعة مصفوفة.

arr.GetLength(y)

يجب ان يكون

arr.GetLength(1)

حسنًا، ماذا لو كان لدي مصفوفة تبدو هكذا

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

كيف سيظل GetLength(1) يعرف طول كل صف؟


ما أريده في الأساس هو.... طريقة للعثور على عدد العناصر في أي صف معين.

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

الكود أعلاه يعمل معي.

تحرير، يبدو الكود متسخًا بالرغم من ذلك.أنا أتساءل ما الذي تحاول تحقيقه؟

هذا الكود في C# هو الحصول على كافة مجموعات العناصر في مصفوفة خشنة:

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

يشبه الإخراج [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] = سيئة [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

تصريحك: DIM arr(3,3) As Integer يحدد allready أن هناك 3 عناصر في أي صف محدد (أو 4، لست متأكدًا من VB)

بامكانك ان تحاول:

Dim arr(3) as Integer()

يجب أن تكون قادرًا بعد ذلك على القيام بما يلي:

arr(n).Length

للعثور على طول الصف ن.

أنا صدئ بعض الشيء في VB6 ولم أتعلم VB.NET مطلقًا، ولكن هذا من شأنه أن يمنحك مصفوفة "خشنة".تحقق من وثائق msdn على المصفوفات متعددة الأبعاد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top