2009-10-27 15 views
12

सबसे अच्छा रास्ता सी # में यह पूरा करने के क्या है सरणी से कन्वर्ट?ICollection को <T>

+10

कोई रूपांतरण, टी औजार की एक सरणी है आईसीओलेक्शन । – Thorarin

+1

Arrays 'ICollection ' सुरक्षित रूप से लागू नहीं करते हैं - देखें [उत्तर] (http://stackoverflow.com/a/12100850/562906)। – sinelaw

उत्तर

36

टी के एरेज़ टी के आईसीओलेक्शन के लिए असाइन किए जा सकते हैं, टी के एलीस्ट के रूप में टी के आईएलिस्ट टी टी के आईसीओलेक्शन को बढ़ाता है, ताकि आप केवल आईसीओलेक्शन में एक सरणी असाइन कर सकें।

class Foo {} 

Foo [] foos = new Foo [12]; 
ICollection<Foo> foo_collection = foos; 
+0

क्या आप यह कह रहे हैं कि, मूल रूप से, * कन्वर्ट * की कोई आवश्यकता नहीं है क्योंकि ऐरे पहले से ही * एक आईसीओलेक्शन है? –

0

जवाब और टिप्पणी करने के लिए इसके अलावा, यदि आप अन्य रास्ता तय करना चाहते हैं, आप IEnumerable<T> पर ToArray() विधि (जो ICollection<T> से उतरता है) का उपयोग करें।

20

लघु जवाब:

उपयोग ToList()T[] पर भरोसा न करें ICollection<T> पर असाइन किए जा रहे हैं जब तक कि आप निम्न से अवगत न हों और जानें कि आप क्या कर रहे हैं।

यदि आपको इसे केवल पढ़ने की आवश्यकता है, तो Array.AsReadOnly(T[]) का उपयोग करना बेहतर है और अतिरिक्त प्रति से बचें, और नीचे दी गई समस्याओं से बचें।


विस्तृत जवाब:

हालांकि टी के सरणी (। यानी T[]) तकनीकी रूप से लागू करता IList<T> (और ICollection<T> और IEnumerable<T>), यह वास्तव में पूरे IList<T> और ICollection<T> इंटरफेस को लागू नहीं करता है , जैसा कि in the documentation का उल्लेख किया गया है:

... इन इंटरफेस में से किसी एक को सरणी डालने के बारे में जागरूक होने वाली महत्वपूर्ण बात यह है कि NotSupportedException तत्वों को जोड़ने, डालने या निकालने वाले सदस्य हैं।

दूसरे शब्दों में, अगर आप सिर्फ ICollection<T> को सरणी डाली आप NotSupportedException जैसे ही आप ऊपर उल्लिखित तरीकों में से किसी भी फोन मिल जाएगा।

तो सबसे अच्छा तरीका है एक ICollection<T> को एक सरणी सुरक्षित रूप से कन्वर्ट करने के लिए इस तरह के रूप में उपयोग करते हुए, एक नया वस्तु बनाने के लिए किया जाएगा Linq के ToList():

T[] array; 

// Will create a new list based on the current contents of the array 
ICollection<T> collection = array.ToList(); 
+1

यह बहुत बेहतर उत्तर है, स्वीकार किए बिना इन्हें बिना किसी देखभाल के "कास्टिंग" का उल्लेख नहीं किया जाता है। –

+0

तो अगर मुझे पता है कि मैं संग्रह को संशोधित नहीं कर रहा हूं, तो आईसीओलेक्शन डालना सुरक्षित है? –

+0

@DanielLorenz अगर आप इसे केवल पढ़ने के लिए चाहते हैं, तो इसे बेहतर तरीके से लागू करना बेहतर है ['Array.AsReadOnly (T []) '] (https://docs.microsoft.com/en-us/dotnet/api/system। array.asreadonly? दृश्य = netframework -4।7 # System_Array_AsReadOnly__1 ___ 0___) – sinelaw

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