كيفية تحويل ArrayList إلى مجموعة من هيكل ؟
سؤال
هنا لدي:
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 أو أعلى، والنظر في قائمة
نصائح أخرى
وعليك أن يلقي نتيجة 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 و في وقت لاحق إلى استخدام صفيف بدلا من قائمة عامة:
- تعرف مع اليقين المطلق عدد من البنود التي لديك ، و أعرف أن العد لن تتغير.هذا هو المستغرب نادرة.
- تحتاج إلى استدعاء دالة تتطلب صفيف.لا يزال هناك عدد لا بأس به من هذه الكامنة في BCL ، ولكن التعليمات البرمجية الخاصة بك ينبغي أن يسأل عن
IEnumerable<T>, IList<T>, or ICollection<T>
, و إلا نادرا صفيف.
أخيرا, هذا هو نوع من أحمق من الصعب إرضاءه ، ولكن هناك اثنين الأسلوبية نقطة أريد عنوان في الكود الذي نشر.أول ملاحظة يختصر جملة اعتدت على خلق New List<MyStruct>
.لا يوجد = رمز لا يجب أن المفتاح في نوع الاسم مرتين.كان هذا الدعم مرة أخرى في 1.1 كذلك, لذلك ليس هناك عذر هناك.ثانيا ، النمط توجيهية .صافي نشرت من قبل مايكروسوفت على MSDN (انظر العامة اصطلاحات التسمية القسم) توصي ضد المجرية الثآليل مثل 'س' أو 'a'.كان من الجيد بالنسبة VB6/VBScript التي تم كتابتها فضفاضة ، ولكن .صافي هو مكتوب بشدة ، مما يجعل البثور, حسنا, ثؤلول-القبيح.