2011-10-13 20 views
59

मेरे पास एक कक्षा है जो IEnumerable लागू करती है, लेकिन IEnumerable<T> लागू नहीं करती है। मैं इस वर्ग को नहीं बदल सकता, और मैं इसके बजाय किसी अन्य वर्ग का उपयोग नहीं कर सकता। जैसा कि मैंने एमएसडीएन LINQ can be used if class implements IEnumerable<T> से समझा है। मैंने instance.ToQueryable() का उपयोग करने का प्रयास किया है, लेकिन यह अभी भी LINQ विधियों को सक्षम नहीं करता है। मुझे यकीन है कि इस वर्ग में केवल एक ही प्रकार के उदाहरण हो सकते हैं, इसलिए कक्षा IEnumerable<T> लागू कर सकती है, लेकिन यह अभी नहीं है। तो LINQ अभिव्यक्तियों का उपयोग करके इस वर्ग से पूछने के लिए मैं क्या कर सकता हूं?क्या LINQ IENumerable के साथ काम करता है?

+0

को समझने के लिए कम उदाहरण दे देंगे, सभी LINQ तरीकों के बजाय आप केवल 8 तरीकों देखेंगे: AsQueryable , कास्ट <>, बराबर, GetEnumerator, GetHashCode, GetType, OfType <>, ToString – ShawnFeatherly

उत्तर

101

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

ईजी।

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

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

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

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

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

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

IEnumerable e = ...; 
IEnumreable<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); 
} 

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

-1

हाँ यह करता है,

मैं तुम्हें IEnumerable कास्टिंग के बिना आप बेहतर

List<Student> obj = new List<Student>(); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 
     obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" }); 


     IEnumerable<Student> students = from x in obj.AsEnumerable() 
             select x; 


     foreach (var item in students) 
     { 
      MessageBox.Show(item.name); 
     } 



    class Student 
     { 
      public string name { get; set; } 
      public int roll { get; set; } 
      public string school { get; set; } 
     } 
+0

'सूची ' पहले से ही लागू होता है 'IENumerable ' जिसे ओपी विशेष रूप से कहता है कि उनका ऑब्जेक्ट नहीं है। – MEMark

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