2010-12-14 10 views
5

मेरे पास ArrayListBookingDataList<BookingData> प्रकार है?ArrayList से सूची में डालने का सबसे अच्छा तरीका क्या है .Net 2.0

मैं .net 2.0 का उपयोग कर रहा हूं इसलिए मैं arrayList.Cast<int>().ToList() का उपयोग नहीं कर सकता, और मैं यहां फ़ोरैच लूप नहीं बनाना चाहता, क्या आपके पास बेहतर विचार हैं?

धन्यवाद।

+0

सी # में आपको वास्तव में 'ऐरेलिस्ट' को 'सूची' में डालने की ज़रूरत है? – khachik

+0

@khachik: 'ArrayList' प्रकार 'ऑब्जेक्ट' और 'सूची' प्रकार का एक सामान्य प्रकार है। – Bobby

+0

@khachik, वे सी # में ठोस वर्ग दोनों हैं। –

उत्तर

11

ध्यान दें कि कुछ का निर्माण करने वालों की सूची की गणना करने के लिए जा रहा है List<T>; यह केवल एक बात है कि आप इसे स्वयं करते हैं या इसे किसी अन्य (ढांचे/उपयोगिता) विधि पर छोड़ दें।

  1. यदि यह एक बंद है, समाधान है कि आप (रूपांतरण करने के लिए एक "यथा-स्थान" foreach पाश का प्रयोग करके) से बचने की इच्छा एक पूरी तरह से उचित विकल्प है। यदि आप इसे अक्सर ऐसा करते हैं, तो आप इसे सामान्य उपयोगिता विधि में निकाल सकते हैं, जैसे कि सीडीओवी के जवाब में।

  2. यदि आपका प्रतिबंध केवल यह है कि आप चाहिए लक्ष्य .NET 2.0 (लेकिन सी # का उपयोग कर सकते 3), LINQBridge, जो .NET 2.0 के लिए वस्तुओं के लिए LINQ की एक reimplementation है पर विचार करें। यह आपको बिना बदलाव के प्रदान किए गए Cast नमूने का उपयोग करने देगा। यह सी # 2 पर भी काम करेगा, लेकिन आपको विस्तार-विधि वाक्यविन्यास, बेहतर प्रकार-अनुमान आदि का लाभ नहीं मिलेगा

  3. यदि आपको प्रदर्शन की परवाह नहीं है, और न ही आप जाना चाहते हैं एक उपयोगिता विधि लिखने की मुसीबत, आप मदद करने के लिए एक मध्यस्थ के सरणी कि List<T> साथ अच्छी तरह से खेलता है बनाने के द्वारा में निर्मित ArrayList.ToArray विधि इस्तेमाल कर सकते हैं (यह सब है कि एक foreach की तुलना में कम नहीं है):


ArrayList arrayList = ... 

// Create intermediary array 
BookingData[] array = (BookingData[]) arrayList.ToArray(typeof(BookingData)); 

// Create the List<T> using the constructor that takes an IEnumerable<T> 
List<BookingData> list = new List<BookingData>(array); 

अंत में, मैं सुझाव दूंगा कि अप्रचलित गैर-जेनेरिक संग्रह-वर्गों का उपयोग करके पूरी तरह से छोड़ना संभव है।

 foreach (Object item in list1) 
     { 
      list2.Add((BookingData)item); 
     } 
+2

बस एफवाईआई, यह विधि एक अनावश्यक इंटरमीडिएट सरणी बनाएगी। – cdhowie

1

इस विधि का उपयोग करें:

public static List<T> ConvertToList<T>(ArrayList list) 
{ 
    if (list == null) 
     throw new ArgumentNullException("list"); 

    List<T> newList = new List<T>(list.Count); 

    foreach (object obj in list) 
     newList.Add((T)obj); 

    // If you really don't want to use foreach: 
    // for (int i = 0; i < list.Count; i++) 
    //  newList.Add((T)list[i]); 

    return newList; 
} 

तो आप कर सकते हैं:

List<BookingData> someList = ConvertToList<BookingData>(someArrayList); 
+0

.NET 2.0 कंपाइलर एक्सटेंशन विधियों और var का समर्थन नहीं करता है। – TToni

+0

@TToni: पर्याप्त सच है। हालांकि यह केवल एक वाक्य रचनात्मक अंतर है। मैं इसे ठीक कर दूंगा। – cdhowie

+0

कोड तर्क वही है, फिर भी। –

0

आप foreach उपयोग करने के लिए सूची आइटम उत्पन्न करने के लिए लूप।

तो यह एक foreach iterator ब्लॉक का उपयोग करने के लिए बहुत साफ और सरल है।

+0

आपके पास * foreach का उपयोग करने के लिए * है? कुछ और काम नहीं करेगा? – cdhowie

+0

कोई भी अन्य लूप निर्माण 'होगा ... लेकिन आपको इसके माध्यम से लूप करना होगा। – decyclone

2

के यह सरल रखने के चलो:

// untested 
List<T> ConvertArrayList<T>(ArrayList data) 
{ 
    List<T> result = new List<T> (data.Count); 
    foreach (T item in data) 
     result.Add(item); 
    return result; 
} 

... 

List<BookingData> newList = ConvertArrayList<BookingData>(oldList); 
+0

आपको 'item' को' T' में डालना होगा। – cdhowie

+3

@cdhowie: अगर स्मृति कार्य करता है तो वह ऐसा करेगा। पुराना Fx2 वूडू। –

+0

ओह, ठीक है। मैं हमेशा इस तरह के अंतर्निहित जानवरों के बारे में भूल जाते हैं। – cdhowie

0

ToList() प्रणाली सूची प्रतिनिधित्व बनाने के लिए लेकिन सिंथेटिक चीनी कुछ भी नहीं है लेकिन आंतरिक रूप से यह भी उपयोग कर रहा है

संबंधित मुद्दे