كيف يمكنني الحصول على بعد واحد من صفيف ثنائي الأبعاد في vb.net؟

StackOverflow https://stackoverflow.com/questions/2344034

  •  23-09-2019
  •  | 
  •  

سؤال

لديّ تطبيق في VBA يعطي لمتغير ثنائي الأبعاد VB.NET DLL الخاص بي. إنها صفيف ، حيث يكون كل مكون صفيفًا آخر يحتوي على وضعين.

أريد الحصول على هذه الصفيف المكون من موقعين. عندما أستخدم VBA ، يمكنني الوصول مباشرة إلى البيانات من كل موضع عن طريق القيام:

dataArray(index, 0) or dataArray(index, 1)

وعندما أرغب في الحصول على صفيف الموضعين يمكنني استخدامه:

Dim posArray as variant
posArray = dataArray(index)

يحتوي Posarray (0) على DataArray (الفهرس ، 0) و Posarray (1) يحتوي على DataRaray (الفهرس ، 1).

ولكن عندما أستخدم vb.net ، يمكنني الوصول مباشرة إلى البيانات ، تمامًا مثل المثال الأول. ومع ذلك ، عندما أحاول الحصول على بُعد واحد من صفيف ثنائي الأبعاد ، كما فعلت في المثال الثاني ، لا يمكن ذلك.

Dim posArray as Object
posArray = dataArray(index)

تقول "حاولت العمل على صفيف مع عدد غير صحيح من الأبعاد."

لقد جربت كل شيء لجعله يعمل ، ولا أريد أن أجعل الإسناد واحد تلو الآخر ، مثل:

posArray(0) = dataArray(index, 0)
posArray(1) = dataArray(index, 1)

شكرا للمساعدة.

هل كانت مفيدة؟

المحلول

ستحتاج إلى تدور وإنشاء صفيف 1D بنفسك. لا توجد مكتبة مكتبة في .NET للقيام بذلك نيابة عنك.

dim arraySlice as string[yourArrayWidth]
for index = 0 to yourArrayWidth
  arraySlice[index] = yourArray[4, index]
next

المثال أعلاه سوف يمسك الصف 4 من خارجك ويلصقه في صفائف من أجلك. بطبيعة الحال ، ستحتاج إلى تنظيف ذلك ووضعه في وظيفة تقبل RowIndex كمعلمة (ودالة أخرى لتقسيم عموديًا تقبل ColumnIndex).

إنها وظائف قليلة مثل هذه التي ستجمعها على مر السنين في مكتبة المرافق الخاصة بك. بعد 5 سنوات من الآن ، ستحتاج إلى مصفوفة وستكون لديك بالفعل وظيفة للقيام بذلك.

نصائح أخرى

Dim Dim1Len As Integer = 5
Dim Dim2Len As Integer = 2
Dim DimToExtract As Integer = 2
Dim inMultiDArr(5, 2) As Integer
inMultiDArr = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}}
Dim outSingleDArr(5) As Integer
outSingleDArr = {0, 0, 0, 0, 0}

Buffer.BlockCopy(inMultiDArr, Marshal.SizeOf(GetType(Integer)) * Dim1Len * (DimToExtract - 1),
                 outSingleDArr, 0, Marshal.SizeOf(GetType(Integer)) * Dim1Len)

بعد BlockCopy سيحتوي "Outsingledarr" على {6 ، 7 ، 8 ، 9 ، 10}. تم اشتقاق ما سبق هذا المشنور.

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