2011-10-24 17 views
5

मैं इस तरह कुछ करना चाहता हूँ:क्या मैं श्रृंखला तुलना करने के लिए पूर्णांक पर कोलेसे ऑपरेटर का उपयोग कर सकता हूं?

public override int CompareTo (Foo rhs) 
{ 
    return Bar.CompareTo(rhs.Bar) ?? 
      Baz.CompareTo(rhs.Baz) ?? 
      Fuz.CompareTo(rhs.Fuz) ?? 0; 
} 

यह लिखा के रूप में काम नहीं करता है; क्या यह काम करने के लिए कुछ न्यूनतम कामकाज है? असल में मैं गैर-शून्य (या श्रृंखला के अंत) तक श्रृंखला तक 0 चाहता हूं।

+0

मैं आपके सवाल का जवाब पता नहीं है, लेकिन तीन मानों वापसी मान निर्धारित करने के लिए इस्तेमाल किया जा सकता है, तो आप अपने वर्ग की पुनः रचना पर विचार करना चाहते हो सकता है। –

+0

@ डीजे 'तुलना टीओ सॉर्टिंग से संबंधित है; यह बहुत आम है, वास्तव में - उदाहरण के लिए, उपनाम द्वारा क्रमबद्ध करें - यदि वह वही है, तो फर्स्टनाम द्वारा क्रमबद्ध करें, फिर यदि अभी भी बराबर है, तो कुछ अद्वितीय पहचानकर्ता (उदाहरण के लिए डेटाबेस आईडी) द्वारा क्रमबद्ध करें। –

+0

@Marc दिलचस्प, मैं इससे पहले खुलासा नहीं किया गया है। मैं देखता हूं कि तुलनात्मक आईसीओपरपेबल वर्ग का हिस्सा है। मुझे कुछ परिप्रेक्ष्य प्राप्त करने के लिए और अधिक पढ़ना होगा। धन्यवाद –

उत्तर

2

भाषा द्वारा समर्थित नहीं के लिए काम करता

int delta = Bar.CompareTo(rhs.Bar); 
if(delta == 0) delta = Baz.CompareTo(rhs.Baz); 
if(delta == 0) delta = Fuz.CompareTo(rhs.Fuz); 
return delta; 
+0

उह। इस तरह के समाधान बताते हैं कि यह कितना बेकार है कि हमारे पास वैश्विक कार्य नहीं हो सकते हैं। –

+0

यदि कोई अधिक उपयोग किया जाता है, तो इसे हमेशा एक एक्सटेंशन फ़ंक्शन में डाल सकता है। – driis

+0

क्या एक विस्तार? Int32? क्या यह भी संभव है? –

2

मूल रूप से नहीं, लेकिन यह अच्छा होगा अगर (आईआईआरसी, जॉन ने गहराई में सी # में एक समान विचार का उल्लेख किया)। आप शायद सशर्त, श्रृंखला सकता है, लेकिन मैं तो बस का उपयोग करते हैं: वास्तव में, ?? केवल शून्य मान (संदर्भ प्रकार या नल structs)

int i; 

i = Bar.CompareTo(rhs.Bar); 
if (i != 0) return i; 

i = Baz.CompareTo(rhs.Baz); 
if (i != 0) return i; 

i = Fuz.CompareTo(rhs.Fuz); 
if (i != 0) return i; 

return 0; 
2

। लेकिन आप इस तरह से एक छोटा सा सहायक लिख सकते हैं:

public override int CompareTo (Foo rhs) 
{ 
    return FirstNonZeroValue(
     () => Bar.CompareTo(rhs.Bar), 
     () => Baz.CompareTo(rhs.Baz), 
     () => Fuz.CompareTo(rhs.Fuz)); 
} 

private int FirstNonZeroValue(params Func<int>[] comparisons) 
{ 
    return comparisons.Select(x => x()).FirstOrDefault(x => x != 0); 
} 
0

शॉर्ट सर्किट की जरूरत नहीं है, तो आप कुछ द्विआधारी अंकगणितीय कर सकते हैं। It is not required that the Compare results must be -1, 0, or 1, but that they must be < 0, = 0, > 0। तो 2^n को गुणांक के रूप में उपयोग करके जहां n प्राथमिकता है, आप तुलनात्मक परिणामों को जोड़ सकते हैं और आवश्यकतानुसार एक संख्या> 0 या < 0 प्राप्त कर सकते हैं।

तो, का उपयोग

return 4 * Bar.CompareTo(rhs.Bar) 
    + 2 * Baz.CompareTo(rhs.Baz) 
    + 1 * Fuz.CompareTo(rhs.Fuz); 
संबंधित मुद्दे

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