سؤال

هنا لدي:

Public Structure MyStruct
   Public Name as String
   Public Content as String
End Structure

Dim oStruct as MyStruct = New MyStruct()
oStruct.Name = ...
oStruct.Content = ...

Dim alList as ArrayList = new ArrayList()
alList.Add(oStruct)

أود أن تحويل ArrayList إلى ثابت بقوة كتبته مجموعة من نوع MyStruct.كيف يمكن أن أفعل ذلك ؟ لم يكن لدي أي حظ مع ToArray.

أنا باستخدام .NET Framework 2.0.

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

المحلول

وأفترض أنه منذ كنت تستخدم ArrayList، كنت تستخدم 1.1؟

في هذه الحالة، وأظن أن يلي العمل:

ArrayList list = new ArrayList();
MyStruct[] array = new MyStruct[list.Count];
list.CopyTo(array); 

و(تحرير - استخدام ToArray بيل هو أكثر ملاءمة - لم أكن أعرف عن ذلك واحد، ولكن بعد ذلك، وأنا نادرا جدا [لم يكن أبدا] استخدام ArrayList)

ومع ذلك، إذا MyStruct هو في الحقيقة البنية، ثم لا أستطيع أن أقول بقوة كافية أن البنيات قابلة للتغيير هي فكرة سيئة - أي حيث يمكنك تعيين .Name و.Content بعد الخلق. يجب أن تكون البنيات دائما تقريبا غير قابل للتغيير. في الواقع، MyStruct الخاص بك يبدو أنه ينبغي أن تكون فئة. أيضا - أنا لا "حتى" في VB، ولكن هل هي حقول العامة؟ مرة أخرى - لا ينصح - أن خصائص يكون من الأفضل. أنا لا أعرف عن VB، ولكن C # 3.0 لديه بعض تركيب مقتضب جدا لذلك:

public class SomeType
{
    public string Name {get;set;}
    public string Content {get;set;}
}

إذا كنت تستخدم 2.0 أو أعلى، والنظر في قائمة بدلا من ArrayList.

نصائح أخرى

وعليك أن يلقي نتيجة ToArray

MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));

وToArray هو الطريق الصحيح للذهاب. في C # سيكون:

MyStruct[] array = (MyStruct[]) alList.ToArray(typeof(MyStruct));

هل أنت تمسك باستخدام 1.1، راجع للشغل؟ إذا كنت تستخدم 2.0، يمكنك التحول إلى قائمة بدلا من ذلك؟

وهذا عمل بالنسبة لي

Dim array As MyStruct() = alList.ToArray(GetType(MyStruct))

إذا كنت بتشغيل Visual Studio 2008 يمكنك استخدام كائن قائمة.

  Dim alList As New List(Of MyStruct)
  alList.Add(oStruct)

في حال كنت تستخدم الإصدار 2.0 أو في وقت لاحق ، قد ترغب في تحديد arraylist مثل هذا:

Dim alList as New List(Of MyStruct)()
alList.Add(oStruct)

هذا وسوف تعطيك نفس دلالات كما صفيف (البحث عن طريق مؤشر الكتابة قوية ، IEnumerable الدعم ، إلخ).

هناك اثنين فقط من الأسباب .Net 2.0 و في وقت لاحق إلى استخدام صفيف بدلا من قائمة عامة:

  1. تعرف مع اليقين المطلق عدد من البنود التي لديك ، و أعرف أن العد لن تتغير.هذا هو المستغرب نادرة.
  2. تحتاج إلى استدعاء دالة تتطلب صفيف.لا يزال هناك عدد لا بأس به من هذه الكامنة في BCL ، ولكن التعليمات البرمجية الخاصة بك ينبغي أن يسأل عن IEnumerable<T>, IList<T>, or ICollection<T>, و إلا نادرا صفيف.

أخيرا, هذا هو نوع من أحمق من الصعب إرضاءه ، ولكن هناك اثنين الأسلوبية نقطة أريد عنوان في الكود الذي نشر.أول ملاحظة يختصر جملة اعتدت على خلق New List<MyStruct>.لا يوجد = رمز لا يجب أن المفتاح في نوع الاسم مرتين.كان هذا الدعم مرة أخرى في 1.1 كذلك, لذلك ليس هناك عذر هناك.ثانيا ، النمط توجيهية .صافي نشرت من قبل مايكروسوفت على MSDN (انظر العامة اصطلاحات التسمية القسم) توصي ضد المجرية الثآليل مثل 'س' أو 'a'.كان من الجيد بالنسبة VB6/VBScript التي تم كتابتها فضفاضة ، ولكن .صافي هو مكتوب بشدة ، مما يجعل البثور, حسنا, ثؤلول-القبيح.

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