2012-01-25 14 views
8

एक विधि में, मुझे object मिलता है।आइटम को किसी ऑलिस्ट <> ऑब्जेक्ट के रूप में प्राप्त करने से कैसे प्राप्त किया जाए?

कुछ स्थितियों में, यह object "कुछ" के IList (मेरे पास इस पर कुछ नियंत्रण नहीं है ") हो सकता है।

मैं कोशिश कर रहा हूँ:

  1. पहचानें कि इस वस्तु एक IList (कुछ की) है
  2. एक "IList<something>" में object कास्ट से Count प्राप्त करने के लिए सक्षम होने के लिए।

अभी के लिए, मैं अटक और विचारों की तलाश में हूँ।

+0

क्या 'गणना' * सब * आप चाहते हैं? यदि ऐसा है, तो आपको इसे 'IList ' होने की आवश्यकता नहीं है, एक सरल 'IENumerable' करेगा। – AakashM

+0

हां, 'गिनती' वह सब है जो मैं चाहता हूं। हालांकि, मैं 'IENumerable' में कोई भी 'गणना' नहीं देख सकता हूं? – remio

उत्तर

17

आप देख सकते हैं कि is का उपयोग कर IList लागू करता है या नहीं।

तो फिर आप अपने objectIList लिए डाली संख्या प्राप्त कर सकते हैं।

object myObject = new List<string>(); 

// check if myObject implements IList 
if (myObject is IList) 
{ 
    int listCount = ((IList)myObject).Count; 
} 
+0

आह, बढ़िया, यह वही है जो मुझे याद आया। मैं 'IList ' 'IList' होने की तलाश में था। लेकिन 'सूची ' और 'संग्रह 'के रूप में' IList' है, यह मेरे लिए पर्याप्त है। धन्यवाद। – remio

4
if (obj is ICollection) 
{ 
    var count = ((ICollection)obj).Count; 
} 
+0

आपके उत्तर के लिए धन्यवाद। 'IList' में कास्टिंग पर' ICollection' में कास्टिंग का कोई फायदा है? – remio

+1

अधिक प्रकार के संग्रहों के साथ काम करेगा, आईन्यूमेरेबल को कास्टिंग और पढ़ने के बजाय। गणना()। काउंटर और भी काम करेगा। –

+1

@DannyVarod लेकिन 'आइट्यून्यूमेबल.काउंट()' अपने आइटमों को गिनने के लिए संग्रह की गणना करने वाले जोखिम। – phoog

1
 object o = new int[] { 1, 2, 3 }; 

     //... 

     if (o is IList) 
     { 
      IList l = o as IList; 
      Console.WriteLine(l.Count); 
     } 

यह प्रिंट 3, क्योंकि पूर्णांक [] एक IList है।

0

चूंकि आप चाहते हैं कि यह गिनती है, आप इस तथ्य का उपयोग कर सकते हैं कि IList<T> लागू करने वाली कोई भी चीज़ IEnumerable लागू करती है;

var ienumerable = inputObject as IEnumerable; 
if (ienumerable != null) 
{ 
    var count = ienumerable.Cast<object>().Count(); 
} 

Cast करने के लिए कॉल क्योंकि बॉक्स there isn't a Count on non-generic IEnumerable से बाहर है: और इसके अलावा वहाँ System.Linq.Enumerable में एक विस्तार विधि है कि किसी भी (सामान्य) अनुक्रम की गणना देता है।

+0

आह, हाँ, मुझे यह मिल गया! लेकिन क्या मुझे इस कार्यान्वयन के साथ प्रदर्शन प्रभाव की उम्मीद करनी होगी? – remio

+0

@remio हाँ, आप करेंगे। चूंकि आप 'कास्ट ' कह रहे हैं, तो आप अंतर्निहित सूची की 'गणना' संपत्ति से लाभ नहीं उठा पाएंगे, इसलिए आप वस्तुओं की गणना करने के लिए वास्तव में संपूर्ण सूची को फिर से सक्रिय करेंगे। इसके अलावा, यदि सूची के तत्व एक मान प्रकार के हैं, तो आपको उनमें से प्रत्येक को 'ऑब्जेक्ट' पर कास्ट के कारण बॉक्स करना होगा। – phoog

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