IEnumerable <object> a = new IEnumerable <object> (); क्या मैं यह कर सकता हूं?


93

मैं एक वस्तु का एक नया उदाहरण बनाना चाहता हूं IEnumerable<object>

क्या मैं यह कर सकता हूं?

IEnumerable<object> a = new IEnumerable<object>();


1
नहीं, और इसका कोई मतलब भी नहीं है।
— कोडइंचोज

3
@ WingMan20-10: खैर, जो हर किसी को बदलता है। आप एक जेनेरिक में नहीं जोड़ सकते IEnumerable<T>। आपको कुछ का उपयोग करना होगा List<T>।
— जेसन

1
इस मामले में आपको एक ठोस सरणी सूची चाहिए <ऑब्जेक्ट> objs = new IEnumerable <ऑब्जेक्ट>। आप
— इट्रेटर में

1
@ivo: ध्यान दें कि IEnumerable<T>एक पुनरावृत्ति का प्रतिनिधित्व नहीं करता है - यह एक चलने योग्य अनुक्रम का प्रतिनिधित्व करता है। IEnumerator<T>स्वयं पुनरावृति का प्रतिनिधित्व करता है।
— जॉन स्कीट

जवाबों:


117

आप उदाहरण के लिए एक उदाहरण बना सकते हैं List<object>, जो लागू करता है IEnumerable<object>। उदाहरण:

List<object> list = new List<object>();
list.Add(1);
list.Add(4);
list.Add(5);

IEnumerable<object> en = list;
CallFunction(en);

11
यह देखते हुए कि प्रश्न जेनेरिक के उपयोग को दर्शाता है, एक प्रकार का उदाहरण दिया गया जो जेनेरिक IEnumerable<T>को लागू नहीं करता है एक बुरा विचार है आईएमओ।
— जॉन स्कीट

IEnumerable के बजाय CallFunction (list.AsEnumerable ()) का उपयोग करने के साथ कोई समस्या <ऑब्जेक्ट = en ... सूची ...
— Gina Marano

यदि संभव हो तो मैं शाब्दिक आरंभक के साथ एक सरणी का उपयोग करूँगा, यह .NET में उपलब्ध सबसे कुशल और हल्का असंख्य प्रकार है और इसमें सूची <> का ओवरहेड नहीं है। सूचियों का उपयोग केवल तभी किया जाना चाहिए जब आपको वास्तव में आवश्यकता हो या आरंभीकरण के बाद म्यूट करना हो। इसके अलावा, System.Linq को जोड़ना और सरणी या सूची में .EEumerable () को जोड़ना बेहतर है।
— मार्क

33

चूंकि अब आप निर्दिष्ट करते हैं कि आप इसे जोड़ना चाहते हैं, आप जो चाहते हैं वह सरल नहीं है, IEnumerable<T>लेकिन कम से कम एक ICollection<T>। मैं बस List<T>इस तरह का उपयोग करने की सलाह देता हूं :

List<object> myList=new List<object>();
myList.Add(1);
myList.Add(2);
myList.Add(3);

आप लागू IEnumerable<object>होने के बाद से हर जगह myList का उपयोग कर सकते हैं ।List<object>IEnumerable<object>

(स्पष्टीकरण से पहले पुराना जवाब)

आप इसका एक उदाहरण नहीं बना सकते IEnumerable<T>क्योंकि यह सामान्य इंटरफ़ेस है (यह कभी-कभी डिफ़ॉल्ट कार्यान्वयन को निर्दिष्ट करना संभव है, लेकिन आमतौर पर इसका उपयोग केवल COM के साथ किया जाता है)।

तो क्या आप वास्तव में चाहते हैं कि इंटरफ़ेस को लागू करने वाले एक वर्ग को त्वरित किया जाए । यह व्यवहार भिन्न होता है कि आप किस वर्ग को चुनते हैं। IEnumerable<T>

एक खाली अनुक्रम उपयोग के लिए:

IEnumerable<object> e0=Enumerable.Empty<object>();

एक गैर खाली गणना के लिए आप कुछ संग्रह का उपयोग कर सकते हैं जो लागू होते हैं IEnumerable<T>। आम पसंद सरणी हैं T[], List<T>या यदि आप अपरिवर्तनीयता चाहते हैं ReadOnlyCollection<T>।

IEnumerable<object> e1=new object[]{1,2,3};
IEnumerable<object> e2=new List<object>(){1,2,3};
IEnumerable<object> e3=new ReadOnlyCollection(new object[]{1,2,3});

लागू करने IEnumerable<T>का एक और सामान्य तरीका C # 3 में शुरू की गई इट्रेटर सुविधा है :

IEnumerable<object> MyIterator()
{
  yield return 1;
  yield return 2;
  yield return 3;
}

IEnumerable<object> e4=MyIterator();

31

एक अन्य समाधान का उपयोग करना होगा Empty।

IEnumerable<object> a = Enumerable.Empty<object>();

इसके बारे में SO पर एक सूत्र है: क्या Enumerable.Empty () का उपयोग करना बेहतर है क्योंकि एक IEnumerable को शुरू करने के लिए नई सूची के विपरीत?


2
सबसे साफ जवाब!
— eddyP23

24

नहीं, क्योंकि IEnumerableआप एक इंटरफेस नहीं है।

आपको सबसे गैर-इंटरफ़ेस प्रकारों की एक खाली आवृत्ति बनाने में सक्षम होना चाहिए जो लागू होते हैं IEnumerable, जैसे: -

IEnumerable<object> a = new object[] { };

या

IEnumerable<object> a = new List<object>();

@AdamRalph: मैं निराश हो गया, और फिर विचलित हो गया, इसलिए तुरंत एक टिप्पणी नहीं छोड़ सका। इंटरफेस प्रकार हैं, इसलिए आपका उत्तर खतरनाक रूप से गलत है क्योंकि यह एक आम गलत धारणा का प्रचार करता है।
— जेसन


1

मैं एक नई enumerable वस्तु या सूची बनाना चाहता था और इसे जोड़ने में सक्षम था।

यह टिप्पणी सब कुछ बदल देती है। आप एक जेनेरिक में नहीं जोड़ सकते IEnumerable<T>। यदि आप इसमें इंटरफेस के साथ रहना चाहते हैं System.Collections.Generic, तो आपको एक ऐसे वर्ग का उपयोग करने की आवश्यकता है जो इसे लागू ICollection<T>करता है List<T>।


1

मुख्य कारण यह है कि हम इंटरफ़ेस का ऑब्जेक्ट नहीं बना सकते हैं, और IEnumerable एक इंटरफ़ेस है । हमें उस वर्ग की वस्तु बनाने की आवश्यकता है जो इंटरफ़ेस को लागू करता है। यह मुख्य कारण है जिससे हम सीधे IEnumerable की वस्तु नहीं बना सकते हैं।


0

कोई IEnumerable एक इंटरफ़ेस है, आप इंटरफ़ेस का उदाहरण नहीं बना सकते

आप ऐसा कुछ कर सकते हैं

IEnumerable<object> a = new object[0];

क्या यह @Jon Skeet जैसे COM इंटरफ़ेस का उदाहरण बनाना संभव है?
— आर्सेन मकर्त्चयन

पूर्ण रूप से। अजीब, लेकिन सच है। देखें stackoverflow.com/questions/1093536/... और msmvps.com/blogs/jon_skeet/archive/2009/07/07/...
— जॉन स्कीट

1
मुझे लगता है कि COM इंटरफेस के लिए इंटरफ़ेस के बजाय त्वरित डिफ़ॉल्ट निर्दिष्ट करना संभव है।
— संहिताओंइंचौस

@JonSkeet यह कहना अधिक सटीक नहीं है कि कॉलिंग new SomeComInterface()इंटरफ़ेस के संबंधित "CoClass" को इंटरफ़ेस को तुरंत इंस्टेंट करने के बजाय तुरंत करता है?
— 14

@ फोटो: यह सटीक होगा - लेकिन महत्वपूर्ण और विषम बात यह है कि आप newकुछ स्थितियों में इंटरफ़ेस के साथ उपयोग कर सकते हैं ।
— जॉन स्कीट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.