2011-03-08 13 views
8

मुझे पता है, मेरे पास अन्य विकल्प हैं, उदा। मैं चाबियों की एक अलग सूची बनाए रख सकता था। कृपया अन्य विकल्पों का सुझाव न दें। मैं बस जानना चाहता हूं कि मैं इसे खींच सकता हूं या नहीं। कृपया मुझसे मत पूछें कि मैं किस समस्या को हल करने की कोशिश कर रहा हूं, या ऐसा कुछ भी। यह एक शुद्ध और सरल सीएस सवाल है।एक हैशटेबल कास्ट करें। सूची <int> या अन्य आईनेमेरेबल <int>

मैं किसी एक रास्ते से जानता है एक Hashtable से चाबी लेने के लिए और उन्हें एक List<int> या IEnumerable<int> के कुछ अन्य प्रकार के (बेशक यह देखते हुए कि मेरी चाबियाँ तथ्य पूर्णांकों में हैं) में कास्ट करने के लिए जानना चाहते हैं।

यह देखते हुए कि मुझे कोई समस्या नहीं के साथ ऐसा कर सकते हैं:

foreach (int key in hashtable.Keys) 

क्यों यह मेरे त्रुटियों देता है?

(List<int>)hashtable.Keys 
+0

क्या आप अपवाद पोस्ट कर सकते हैं। – Brosto

उत्तर

16

आप LINQ विस्तार उपलब्ध आप निम्न कर सकते तरीकों है, तो ..

List<int> keys = hashtable.Keys.Cast<int>().ToList(); 

इसके अलावा

List<int> keys = hashtable.Keys.OfType<int>().ToList(); 

स्वत: मुक्केबाजी के आधार पर काम कर सकते हैं

+1

+1। विशिष्ट कारण यह है कि 'कुंजी' एक 'आईसीओलेक्शन' है, जो केवल 'आईन्यूमेरेबल' लागू करता है, न कि 'IEnumerable '। –

+1

यह भी ध्यान दें कि चूंकि ओपी "अन्य' IENumerable 'के लिए पूछता है," आप 'ToList' से पूर्ववत कर सकते हैं और केवल वैरिएबल को' IENumerable '(या' var') के रूप में टाइप कर सकते हैं। –

+0

@ एडम रॉबिन्सन गुड कॉल, आपकी स्पष्टीकरण जोड़ने के लिए भी धन्यवाद, मैं फिलहाल एक कमजोर कनेक्शन पर हूं और मेरा जवाब संपादित करना थोड़ा दर्दनाक है इसलिए मैं ओपी को और जानकारी के लिए आपकी टिप्पणियों को स्थगित कर दूंगा। –

0

क्योंकि hashtable.Keys वस्तुओं जो पूर्णांकों की सूची के साथ covariant नहीं है का एक संग्रह है।

+1

यदि हम बाल विभाजित करने जा रहे हैं, तो कॉन्वर्सिस स्पष्ट रूप से आवश्यक नहीं है; परिवर्तनीयता है। –

-1

आपका foreach पाश एक InvalidCastException फेंक होगा यदि Keys संग्रह में int नहीं है।

List<int> के कलाकारों में विफल रहता है क्योंकि संकलक एक विशिष्ट ICollection<T>

+0

कास्ट विफल हो जाता है क्योंकि कुंजी एक प्रकार नहीं है जिसका प्रयोग किया जा सकता है जैसे कि यह एक सूची थी; यह एक आईसीओलेक्शन है, जो एक बहुत ही बुनियादी इंटरफ़ेस है जो सूची में उपलब्ध विधियों का खुलासा नहीं करता है। – KeithS

1

क्योंकि foreach की आवश्यकता है hashtable.Keys एक IEnumerable<TKey> होने के लिए करने के लिए एक गैर सामान्य ICollection परिवर्तित नहीं कर सकते है, जो यह है। हालांकि, hashtable.KeysList<TKey> नहीं है; यह एक साधारण आईसीओलेक्शन है, जो समान नहीं है। यह एक सूची में कन्वर्ट करने के लिए, कुछ Linq का प्रयास करें:

List<int> keys = hashtable.Keys.OfType<int>().ToList(); 

यह मूलतः कुंजी संग्रह के माध्यम से गणना और एक नया सूची के प्रत्येक तत्व जोड़ देगा, तो आप सूची दे। ऑफ टाइप() कास्ट से "सुरक्षित" है; कास्ट सिर्फ पूरे संग्रह को IEnumerable<int> के रूप में पेश करने का प्रयास करता है, जिसके परिणामस्वरूप रनटाइम त्रुटियां या अप्रत्याशित व्यवहार हो सकता है यदि कोई निहित तत्व शून्य है या पूर्ण रूप से पूर्णांक में नहीं डाला जा सकता है। इसके विपरीत, ऑफटाइप, स्रोत के माध्यम से पुन: उत्पन्न होगा और केवल उन तत्वों की गणना करेगा जो वास्तव में इनट्स हैं। या तो काम करता है यदि आप सुनिश्चित हैं कि सभी कुंजी पूर्णांक हैं।

+0

'foreach' के लिए 'IENumerable' की आवश्यकता है, न कि' IEnumerable '। –

+0

तकनीकी रूप से हां, लेकिन यदि वह संख्यात्मक रूप से टाइप किया गया है, तो आपको आइटम वैरिएबल को उस प्रकार के रूप में परिभाषित करने की आवश्यकता है (या जिसे इसे स्पष्ट रूप से डाला जा सकता है); यदि आप 'foreach (intCollectionOfReferenceTypes में int id) जैसे कुछ करने का प्रयास करते हैं तो आपको एक कंपाइलर त्रुटि मिल जाएगी। – KeithS

0

करना या तो गैर जेनेरिक संस्करण के बजाय शब्दकोश का उपयोग कर सकते हैं। या CastTo एक्सटेंशन विधि का उपयोग करें। Hastable.Key द्वारा लौटाए गए गैर-जेनेरिक संग्रह के विवरण के साथ http://msdn.microsoft.com/en-us/library/system.collections.icollection.aspx देखें और साथ ही कास्टिंग विधि से लिंक भी उपयोग कर सकते हैं।