2009-11-03 13 views
6

मैं स्थैतिक वर्ग करने की कोशिश करता हूं, आईकोलेक्शन में जोड़ता हूं लेकिन मुझे कुछ समस्याएं मिलती हैं जिन्हें मैं दूर नहीं कर सकता। इस तरह मैं इस तरह से एक आईसीओलेक्शन पास कर सकते हैं? कारण टी यह कहता है कि इसे हल नहीं किया जा सकता है।टी? AddRange ICollection?

और फिर मुझे आश्चर्य है कि आईसीलेक्शन पर AddRange करने का कोई तरीका है?

मैं इस तरह कुछ सोच रहा था लेकिन मैबी मैं इसके साथ अपने दिमाग से बाहर निकल रहा हूं?

public static ICollection<T> add(this IEnumerable<T> list) 
    { 
     ICollection<T> collection = null; 

     return collection.AddRange(list);    
    } 
+2

मार्कडाउन क्यों? –

उत्तर

15

नहीं है, ICollection<T> एक AddRange विधि नहीं है - और यहां तक ​​कि अगर यह किया है, तो आप भिन्नता null जो एक NullReferenceException फेंक होगा करने की कोशिश कर रहे होते। आपने सूची को जोड़ने के लिए संग्रह निर्दिष्ट नहीं किया है ... आप वास्तव में क्या करने की कोशिश कर रहे हैं?

आप (माना) एक नई List<T> बना सकते हैं - कि पहले से ही एक निर्माता होने का लाभ है जो एक IEnumerable<T> ले सकते हैं और:,

public static ICollection<T> Add<T>(this IEnumerable<T> list) 
{ 
    return new List<T>(list);    
} 

हालांकि उस समय आप वास्तव में सिर्फ Enumerable.ToList() reimplemented किया है पर और

public static ICollection<T> AddTo<T>(this IEnumerable<T> list, 
             ICollection<T> collection) 
{ 
    foreach (T item in list) 
    { 
     collection.Add(item); 
    } 
    return collection; 
} 
: यह एक अलग वापसी प्रकार दिया ...

यदि आप किसी मौजूदा संग्रह करने के लिए सब कुछ जोड़ना चाहते हैं, तो आप इस तरह कुछ चाहते हो सकता है

+0

नए नाम से प्यार करें ... मुझे नहीं पता था कि यह कौन था। :-P –

+0

आप एक सामान्य विधि तर्क खो रहे हैं :) – leppie

+0

@leppie: बस एक संपादन में देखा गया। –

4

यदि मैं सही ढंग से समझता हूं तो आप एक खाली संग्रह में IEnumerable<T> जोड़ना चाहते हैं।

यह आसान नहीं होगा करने के लिए सिर्फ कार्य करें:

ICollection<MyObject> collection = new List<MyObject>(GetIEnumerableOfMyObject()); 

या भी:

ICollection<MyObject> collection = GetIEnumerableOfMyObject().ToList(); 
+0

मुझे नहीं पता था कि मैं एक आईसीओलेक्शन कर सकता हूं, फिर उस तरह की सूची करें। –

+0

'सूची 'लागू' आईसीओलेक्शन ' तो यूप। –

0

अपने स्रोत सूची का संग्रह प्रकार एक वैकल्पिक दृष्टिकोण List(T).ForEach उपयोग करने के लिए, के रूप में है पर निर्भर करता है :

List<string> source = ... 
ICollection<string> dest = ... 

source.Foreach(dest.Add); 

हालांकि, इसकी पठनीयता easy to dispute है।

1

अन्य तरीकों से यह मानना ​​प्रतीत होता है कि आपका आईसीओलेक्शन खाली है और/या आपका आईसीओलेक्शन एक प्रकार की सूची है।

public static void AddRange<T>(this ICollection<T> ic, IEnumerable<T> ie) 
{ 
    foreach (T obj in ie) 
    { 
     ic.Add(obj); 
    } 
} 

हालांकि, ध्यान रखें कि जब सूची impliments ICollection, इस अस्पष्टता जब सूची वस्तुओं के साथ सीधे निपटने का कारण हो सकता है (हालांकि मैं नहीं है: हालांकि, अगर आप AddRange चाहते हैं, तो आप ICollection वर्ग इस प्रकार का विस्तार कर सकते परीक्षण किया गया है कि संकलक इसे हल करने में सक्षम होंगे - मेरी आंत प्रतिक्रिया यह है कि, हालांकि, AddRange सूची का सदस्य है और संकलक एक्सटेंशन को देखने से पहले सदस्य कार्यों के माध्यम से पहले जाएगा, लेकिन यदि मैं गलत हूं मुझे यकीन है कि कोई मुझे सही करेगा)।

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