2009-02-02 15 views
7

के साथ कोई समस्या है ठीक है तो मेरे पास नीचे दिए गए कोड के समान परिदृश्य है, मेरे पास एक अभिभावक वर्ग है जो आईसीओम्पेर्बल और बाल वर्ग लागू करता है।मुझे IComparable और संग्रह सॉर्ट विधि

class Parent : IComparable<Parent> 
class Child : Parent 

Child a = new Child(); 
Child b = new Child(); 
a.CompareTo(b); 

अब ऊपर काम करता है ठीक, मैं तुलना कर सकते हैं बच्चे के दोनों एक दूसरे के लिए कोई समस्या नहीं

List<Child> l = new List<Child>(); 
l.Add(b); 
l.Add(a); 
l.Sort(); 

ऊपर हालांकि एक InvalidOperationException के साथ विफल वस्तुओं। क्या कोई कृपया बता सकता है कि यह वर्ग काम क्यों नहीं कर रहा है जब बच्चा वर्ग आईसीओपरपेबल इंटरफ़ेस को कार्यान्वित करता है, या कम से कम ऐसा लगता है कि यह करता है।

यहाँ ठीक है

public int CompareTo(IDType other) 
{ 
     return this.Name.ToString().CompareTo(other.ToString()); 
} 
+0

आपका नमूना कहते हैं, "नई सूची ()" जो मेरा अनुमान है कि कोई गलती है ... सूची बना रहे हैं, पर वास्तविक सामान्य प्रकार क्या है? –

+0

ओह क्षमा करें हाँ यह एक टाइपो था, मेरी सूची एल = नई सूची (); मुझे लगता है कि यह काफी स्पष्ट है कि मैं जेनेरिक प्रकार की सूची बना रहा था। – CalvinR

+0

क्या हम आपके आईसीओपरपेबल कार्यान्वयन से कोड देख सकते हैं? –

उत्तर

6

आपका प्रकार लागू करता IComparable<Parent> बजाय IComparable<Child> अपने वास्तविक माता पिता वर्ग के लिए मेरी compareTo कार्यान्वयन है। MSDN docs for Sort कहता है, अगर यह "डिफ़ॉल्ट तुलनाकर्ता तुलनाकर्ता (टी) है तो यह अवैधऑपरेशन अपवाद को फेंक देगा। डीफॉल्ट को टीओ के लिए आईसीओपरपेबल (टी) जेनेरिक इंटरफ़ेस या आईसीओम्पेर्बल इंटरफ़ेस का कार्यान्वयन नहीं मिल सकता है।" और वास्तव में यह नहीं कर सकता, जहां टी बच्चा है। यदि आप इसे List<Parent> बनाने का प्रयास करते हैं तो आपको यह ठीक लगेगा।

संपादित करें: वैकल्पिक रूप से (और अधिमानतः, आईएमओ) IComparable<Child> लागू करें। फिलहाल यह बिल्कुल स्पष्ट नहीं है कि एक बच्चे को समझदारी से दूसरे बच्चे के साथ तुलना की जा सकती है। IComparable<Child> कार्यान्वित करना - भले ही वह कार्यान्वयन केवल आधार कार्यान्वयन को रोकता है - तुलनात्मकता का विज्ञापन करता है।

+0

कोई मेरी तुलना ठीक काम नहीं करती है, मैं बस एक स्ट्रिंग सदस्य चर की तुलना फ़ंक्शन का उपयोग कर रहा हूं जो मूल वर्ग में संग्रहीत है। – CalvinR

+0

कुछ और जांचने के बाद पूरी तरह से उत्तर बदल गया :) –

+1

मैन जो पूर्ण कचरा है, यह ठीक काम करता है अगर मैं अभिभावक वर्ग में गैर-जेनेरिक आईसीओपरपेबल लागू करता हूं। – CalvinR

3

मैंने यह कोशिश की और एक ही त्रुटि में भाग गया। मेरा अनुमान है कि क्योंकि आपके पास List<Child> है, यह किसी ऐसे व्यक्ति की तलाश में है जो IComparable<Child> लागू करता है, IComparable<Parent> नहीं।

यदि आप संग्रह को List<Parent> पर बदलते हैं, तो चीजें काम करने लगती हैं। वैकल्पिक रूप से, बच्चे को IComparable<Child> लागू करें (और यह केवल माता-पिता के कार्यान्वयन के लिए प्रतिनिधि हो सकता है)।

+0

हाँ दुर्भाग्यवश मैं अपने संग्रह को किसी भी समय काम करने के लिए नहीं बदल रहा हूं, इसलिए मुझे लगता है कि मुझे केवल गैर-जेनेरिक आईसीओपरपेबल को लागू करना होगा या बस उन वर्गों में से प्रत्येक को जेनेरिक लागू करना होगा जिन्हें मैं सॉर्ट करना चाहता हूं । – CalvinR

3

मेरा अनुमान है कि कॉन्वर्सिस/contravariance सामान के साथ कुछ करने के लिए है।

public class Parent : IComparable<Parent> 
    { 
     public int Age { get; set; } 


     public int CompareTo(Parent other) 
     { 

      return this.Age.CompareTo(other.Age); 
     } 

    } 

    public class Child : Parent 
    { 
     public string Name { get; set; } 
    } 

हालांकि, जब मैं गैर सामान्य IComparable लागू करने के लिए माता-पिता को बदल दिया और ऐसा किया, यह काम किया:

public class Parent : IComparable 
    { 
    public int Age { get; set; } 


    public int CompareTo(object other) 
    { 
     Parent p = other as Parent; 
     return this.Age.CompareTo(p.Age); 
    } 

} 

    public class Child : Parent 
    { 
     public string Name { get; set; } 
    } 

कोड मैं परीक्षण किया कारण मुझे लगता है कि कहते हैं, क्योंकि यह विफल रहता है जैसे आपने कहा है इसके साथ:

List<Child> c = new List<Child>(); 
    c.Add(new Child { Age = 10, Name = "Alex" }); 
    c.Add(new Child { Age = 6, Name = "Jack" }); 
    c.Add(new Child { Age = 15, Name = "Bob" }); 

    c.Sort(); 
+0

हाँ मुझे वही चीज़ मिली, मैं बस उम्मीद कर रहा था कि मैं अभी भी सामान्य के सामान्य रूप का उपयोग कर सकता हूं। – CalvinR

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