2010-11-15 18 views
41

मैं एक वर्ग के उदाहरण के साथ एक सरणी को आबाद करने हूँ:IComparable इंटरफ़ेस को कार्यान्वित करने के लिए कैसे?

BankAccount[] a; 
. . . 

a = new BankAccount[] 
{ 
    new BankAccount("George Smith", 500m), 
    new BankAccount("Sid Zimmerman", 300m) 
}; 

एक बार मैं इस सरणी पॉप्युलेट, मैं संतुलन राशि के आधार पर यह सॉर्ट करने के लिए करना चाहते हैं। ऐसा करने के लिए, मैं यह जांचने में सक्षम होना चाहूंगा कि प्रत्येक तत्व IComparable का उपयोग करके क्रमबद्ध है या नहीं।
मुझे इंटरफेस का उपयोग करके ऐसा करने की ज़रूरत है। अब तक मेरे पास निम्न कोड है:

public interface IComparable 
{ 
    decimal CompareTo(BankAccount obj); 
} 

लेकिन मुझे यकीन नहीं है कि यह सही समाधान है या नहीं। कोई सलाह?

उत्तर

79

आपको अपने आप को असंभव परिभाषित नहीं करना चाहिए। यह पहले ही परिभाषित है।

इसके बजाय, आपको लागू करने की आवश्यकता है BankAccount कक्षा पर IComparable।

कहाँ class BankAccount परिभाषित, यकीन है कि यह IComparable इंटरफ़ेस

लागू करता है तो दो वस्तुओं का संतुलन मात्रा में तुलना करने के लिए BankAccout.CompareTo लिख सकते हैं।


संपादित

public class BankAccount : IComparable<BankAccount> 
{ 
    [...] 

    public int CompareTo(BankAccount that) 
    { 
     if (this.Balance > that.Balance) return -1; 
     if (this.Balance == that.Balance) return 0; 
     return 1; 
    } 
} 

संपादित 2 जेफरी एल Whitledge के अच्छे जवाब दिखाने के लिए:

public class BankAccount : IComparable<BankAccount> 
{ 
    [...] 

    public int CompareTo(BankAccount that) 
    { 
     return this.Balance.CompareTo(that.Balance); 
    } 
} 
+0

im खेद यू मुझे कैसे मैं इसे –

+26

मुझे पसंद लागू करेगा का एक उदाहरण दे सकते हैं जैसे LINQ उपयोग करने के लिए की जरूरत है 'this.Balance लौट आते हैं। तुलना करें (वह। बैलेंस); ' –

+0

@jeff बस खराब वाक्यविन्यास –

4

पहले से ही IComparable<T> है, लेकिन आपको आदर्श रूप से IComparable<T> और IComparable दोनों का समर्थन करना चाहिए। इनबिल्ट Comparer<T>.Default का उपयोग करना आम तौर पर एक आसान विकल्प है। Array.Sort, उदाहरण के लिए, इस तरह के एक तुलनाकर्ता स्वीकार करेंगे।

14

IComparable पहले से ही compareTo की इस परिभाषा के साथ .NET में मौजूद है

int CompareTo(Object obj) 

आपको इंटरफ़ेस बनाना नहीं है - आपको इसे कार्यान्वित करना होगा।

BankAccount[] sorted = a.OrderBy(ba => ba.Balance).ToArray(); 
+0

मुझे खेद है कि मैं इसे एक उदाहरण दे सकता हूं कि मैं इसे कैसे कार्यान्वित करूं –

9

एक वैकल्पिक LINQ का उपयोग करें और पूरी तरह IComparable को लागू करने को छोड़ने के लिए है? यही है, क्या आप वास्तव में सरणी में वस्तुओं का क्रम बदलना चाहते हैं? या क्या आप मूल आदेश को नष्ट किए बिना किसी विशेष क्रम में वस्तुओं की एक सूची चाहते हैं?

मैं सुझाव दूंगा कि बाद वाले को करना हमेशा बेहतर होता है। एक विनाशकारी आदेश के लिए LINQ का उपयोग करने पर विचार करें। (और "ए" से अधिक अर्थपूर्ण परिवर्तनीय नाम का उपयोग करने पर विचार करें।)

BankAccount[] bankAccounts = { whatever }; 
var sortedByBalance = from bankAccount in bankAccounts 
         orderby bankAccount.Balance 
         select bankAccount; 
Display(sortedByBalance); 
12

आप विध्वंस तरह सरणी करना चाहते हैं:

public class BankAccount : IComparable { 

    int CompareTo(Object obj) { 
      // return Less than zero if this object 
      // is less than the object specified by the CompareTo method. 

      // return Zero if this object is equal to the object 
      // specified by the CompareTo method. 

      // return Greater than zero if this object is greater than 
      // the object specified by the CompareTo method. 
    } 
} 
+0

मैं इसे आईएसओएमपेयर –

+7

@ लिप्यंतर कार्यान्वित करना चाहता हूं: यह एक बहुत ही वैध प्रतिक्रिया है, लेकिन यह चर्चा से लगता है कि ओपी मुश्किल से समझता है कि इसका क्या अर्थ है एक इंटरफ़ेस वह शायद आपके द्वारा पूछे जा रहे प्रश्नों के स्तर के लिए तैयार नहीं है। – abelenky

+0

हाय एरिक, 'आईसीओम्पेरबल ' को लागू करते समय 'शून्य 'से निपटने के लिए सबसे अच्छा अभ्यास क्या है और' तुलनाकर्ता 'उपclassing' टी' एक संदर्भ प्रकार है? क्या यह उपयोगकर्ता के मामले पर निर्भर करता है या सामान्य रूप से अपवाद फेंकना बेहतर होता है क्योंकि असली तुलना तर्क अक्सर 'टी' पर कुछ संपत्ति को अग्रेषित किया जाता है। – stt106

1

आप केवल इन BankAccounts सॉर्ट, निम्नलिखित

BankAccount[] a = new BankAccount[] 
{ 
    new BankAccount("George Smith", 500m), 
    new BankAccount("Sid Zimmerman", 300m) 
}; 

a = a.OrderBy(bank => bank.Balance).ToArray();