2008-10-09 13 views
5

यहाँ मैं है: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) 

मैं प्रकार MyStruct की एक स्थिर दृढ़ता से टाइप सरणी के लिए ArrayList रूपांतरित करना चाहते हैं। मैं उसे कैसे कर सकता हूँ? मुझे ToArray के साथ कोई भाग्य नहीं था।

मैं .NET Framework 2.0 का उपयोग कर रहा हूं।

+0

मैं आपको नहीं बना सकता - लेकिन * कृपया * ध्यान दें कि MyStruct कितनी कक्षा होनी चाहिए, संरचना नहीं। यह एक * बहुत * भ्रम का कारण बनता है, खासकर उत्परिवर्तनीय प्रकारों (जैसे आपकी) के लिए। –

+0

MyStruct एक वर्ग हो सकता था, लेकिन चूंकि इसमें कोई विधि नहीं है, मुझे लगता है कि केवल एक संरचना का उपयोग करना तेज़ है ?! – Vincent

+1

नहीं; यह structs और कक्षाओं के बीच अंतर नहीं है। स्ट्रेट्स में .NET में विधियां हो सकती हैं; अंतर संदर्भ-प्रकार बनाम मूल्य-प्रकार है। –

उत्तर

1

का परिणाम कास्ट करने के लिए है?

जो मामले में, मुझे लगता है निम्नलिखित काम करेगा:

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

(संपादित करें - बिल की toArray उपयोग अधिक सुविधाजनक है - मुझे लगता है कि एक के बारे में पता था नहीं है, लेकिन फिर, मैं बहुत मुश्किल से ही [अगर कभी ] ArrayList का उपयोग करें)

हालांकि, अगर मायस्ट्रक्चर वास्तव में एक संरचना है, तो मैं दृढ़ता से पर्याप्त नहीं कह सकता कि उत्परिवर्तनीय structs एक बुरा विचार है - यानी आप कहां सेट कर सकते हैं। और निर्माण के बाद सामग्री। स्ट्रक्चर लगभग हमेशा अपरिवर्तनीय होना चाहिए। हकीकत में, आपका MyStruct ऐसा लगता है कि यह एक वर्ग होना चाहिए। इसके अलावा - मैं वीबी पर "ऊपर" नहीं हूं, लेकिन क्या वे सार्वजनिक क्षेत्र हैं? दोबारा - अनुशंसित नहीं - गुण बेहतर होगा। मैं वीबी के बारे में पता नहीं है, लेकिन सी # 3.0 इस के लिए कुछ बहुत ही संक्षिप्त वाक्य रचना है:

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

आप 2.0 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो सूची < टी > बजाय ArrayList पर विचार करें।

+0

मुझे नहीं पता था कि ऐरेलिस्ट 1.1 था। समस्या यह है कि मुझे इसे VB.NET में कोड करने की आवश्यकता है, इसलिए मुझे यकीन नहीं है कि मैं सूची का उपयोग कर सकता हूं। – Vincent

+0

मुझे यकीन है कि वीबी.नेट जेनिक्स का उपयोग कर सकते हैं; एमएसडीएन में यहां एक वीबी उदाहरण है: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx –

+0

मुझे इसे सूची (MyStruct) के साथ मिला। – Vincent

4

आप मुझे लगता है कि जब से तुम ArrayList उपयोग कर रहे हैं, तो आप 1.1 का उपयोग कर रहे ToArray

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

ToArray जाने का सही तरीका है। सी # में यह होगा:

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

क्या आप 1.1, बीटीडब्ल्यू का उपयोग कर अटक गए हैं? यदि आप 2.0 का उपयोग कर रहे हैं, तो क्या आप इसके बजाय सूची < टी> में स्थानांतरित कर सकते हैं?

0

इस के लिए मुझे

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

काम आप विजुअल स्टूडियो 2008 चला रहे हैं यदि आप एक सूची ऑब्जेक्ट का उपयोग कर सकते हैं।

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

आप इसे नेट 2.0 (बनाम2005) में भी कर सकते हैं। –

0

मामले में आप 2.0 का उपयोग कर रहे हैं या बाद में आप इस तरह अपने ArrayList निर्धारित कर सकते हैं:

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

यह आपको एक सरणी के रूप में ही अर्थ विज्ञान दे देंगे (सूचकांक द्वारा देखने, मजबूत टाइपिंग, आईनेमेरेबल सपोर्ट इत्यादि)।

वहाँ नेट 2.0 में से केवल दो कारण हैं और बाद में एक सामान्य सूची के बजाय एक सरणी का उपयोग करें:

  1. आप आइटम की संख्या के निरपेक्ष निश्चितता के साथ पता है, और पता है कि गिनती जीता ' टी बदलो यह आश्चर्यजनक रूप से दुर्लभ है।
  2. आपको एक फ़ंक्शन को कॉल करने की आवश्यकता है जिसके लिए एक सरणी की आवश्यकता है। बीसीएल में इन छिपे हुए लोगों की एक उचित संख्या अभी भी है, लेकिन आपका स्वयं का कोड IEnumerable<T>, IList<T>, or ICollection<T>, और केवल दुर्लभ रूप से एक सरणी मांगना चाहिए।

अंत में, यह एक प्रकार का नाइट-पिक्य है, लेकिन आपके द्वारा पोस्ट किए गए कोड में दो स्टाइलिस्ट अंक हैं जिन्हें मैं संबोधित करना चाहता हूं। सबसे पहले, New List<MyStruct> बनाने के लिए उपयोग किए गए संक्षिप्त वाक्यविन्यास को नोट करें। कोई = प्रतीक नहीं है और आपको दो बार टाइप नाम में कुंजी नहीं है। यह 1.1 में भी समर्थन था, इसलिए वहां कोई बहाना नहीं है। दूसरा, एमएसडीएन पर माइक्रोसॉफ्ट द्वारा प्रकाशित style guidelines for .Net (general naming conventions अनुभाग देखें) विशेष रूप से 'ओ' या 'ए' जैसे हंगेरी मर्दों के खिलाफ अनुशंसा करते हैं। यह वीबी 6/वीबीस्क्रिप्ट के लिए अच्छा था, जिसे कम से कम टाइप किया गया था, लेकिन नेट को दृढ़ता से टाइप किया गया है, जिससे मस्तिष्क, अच्छी तरह से, मस्तिष्क-बदसूरत बना दिया गया है।