LINQ IEnumerable के साथ काम करता है?


87

मेरे पास एक वर्ग है जो लागू IEnumerableकरता है, लेकिन लागू नहीं करता है IEnumerable<T>। मैं इस वर्ग को नहीं बदल सकता, और मैं इसके बजाय किसी अन्य वर्ग का उपयोग नहीं कर सकता। जैसा कि मैंने MSDN LINQIEnumerable<T> से समझा है कि अगर क्लास इम्प्लीमेंट किया जा सकता है । मैंने उपयोग करने की कोशिश की है instance.ToQueryable(), लेकिन यह अभी भी LINQ विधियों को सक्षम नहीं करता है। मुझे पता है कि इस वर्ग में केवल एक ही प्रकार के उदाहरण हो सकते हैं, इसलिए कक्षा लागू हो सकती है IEnumerable<T>, लेकिन यह अभी नहीं है। तो मैं LINQ अभिव्यक्तियों का उपयोग करके इस वर्ग को क्वेरी करने के लिए क्या कर सकता हूं?


IEnumerable को कास्टिंग किए बिना, सभी linq विधियों के बजाय आप केवल 8 विधियाँ देखेंगे: AsQueryable, Cast <>, Equals, GetEnumerator, GetHashCode, GetType ,TType <>, ToString
ShawnFeatherly

जवाबों:


134

आप एक IEnumerable का एक सामान्य संस्करण प्राप्त करने के लिए उपयोग कर सकते हैं Cast<T>()या OfType<T>जो पूरी तरह से LINQ का समर्थन करता है।

उदाहरण के लिए।

IEnumerable objects = ...;
IEnumerable<string> strings = objects.Cast<string>();

या यदि आप नहीं जानते कि यह किस प्रकार का है तो आप हमेशा कर सकते हैं:

IEnumerable<object> e = objects.Cast<object>();

यदि आपके गैर-जेनेरिक IEnumerableमें विभिन्न प्रकार की वस्तुएं हैं और आप केवल उदाहरण के लिए रुचि रखते हैं। तार आप कर सकते हैं:

IEnumerable<string> strings = objects.OfType<string>();

2
हर दिन, मैं LINQ के बारे में कुछ नया सीखता हूँ। हर दिन, मैं इसे अधिक से अधिक प्यार करता हूं।
जोहो मेंडेस

11

हाँ यह कर सकते हैं। Cast<T>इसे टाइप करने के लिए आपको फ़ंक्शन का उपयोग करने की आवश्यकता है IEnumerable<T>। उदाहरण के लिए:

IEnumerable e = ...;
IEnumerable<object> e2 = e.Cast<object>();

अब e2एक है IEnumerable<T>और सभी LINQ फ़ंक्शन के साथ काम कर सकता है।


3

आप LINQ की क्वेरी कॉम्प्रिहेंशन सिंटैक्स का भी उपयोग कर सकते हैं, जो itemएक प्रकार के निर्दिष्ट होने पर रेंज चर के प्रकार ( इस उदाहरण में) में डाली जाती है:

IEnumerable list = new ArrayList { "dog", "cat" };

IEnumerable<string> result =
  from string item in list
  select item;

foreach (string s in result)
{
    // InvalidCastException at runtime if element is not a string

    Console.WriteLine(s);
}

प्रभाव @ JaredPar के समाधान के समान है; विवरण के लिए C # भाषा विनिर्देशन में 7.16.2.2 देखें : स्पष्ट रेंज परिवर्तनीय प्रकार

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