2011-09-10 12 views
5

यदि मैं किसी सूची की सॉर्ट() विधि के उदाहरण के लिए एक कस्टम आईसीओएमपेयर में पास करता हूं, तो क्या तुलनाकर्ता की तुलना (x, y) विधि को कभी भी उसी आइटम के साथ बुलाया जाएगा?सूची में <T> .Sort() विधि, एक आइटम कभी तुलना की तुलना में है?

यानी। क्या यह संभव है कि Compare(x,x) कहा जा सके।

संपादित करें: इस मामले में अधिक रुचि रखते हैं जहां सूची के आइटम विशिष्ट हैं।

+0

निश्चित रूप से, यदि सूची <> एक ही वस्तु को एक से अधिक बार शामिल करती है। –

+0

@ हंस: हाँ, मेरी हटाई गई टिप्पणी में थोड़ा उलझ गया। मैं एक सूची के साथ काम कर रहा था जिसमें एक वर्ग के उदाहरण शामिल थे। बेशक, कुछ कार्यक्रमों में, सूची में कई बार एक ही घटना होने के लिए भी संभव हो सकता है। लेकिन संपादित के रूप में, मैं उस मामले पर सोच रहा था जहां सूची में कक्षा के अलग-अलग उदाहरण थे। – ForeverLearnNeverMaster

+0

@ हंस: जॉनडी का जवाब देखें? – ForeverLearnNeverMaster

उत्तर

9

मैंने इसे आजमाने के लिए एक परीक्षण कार्यक्रम लिखा था। ऐसा लगता है कि यह वास्तव में तुलना करता है() उसी तत्व को स्वयं (कम से कम तुलना करें) को दो बार एक ही आइटम के लिए बुलाया जाता है)। इस कार्यक्रम में, तुलना() को तर्क (2, 2) के साथ बुलाया जाता है।

using System; 
using System.Collections.Generic; 

static class Program 
{ 
    class MyComparer : Comparer<int> 
    { 
     public override int Compare(int x, int y) 
     { 
      Console.WriteLine("Compare(" + x + ", " + y + ")"); 
      if (x < y) return -1; 
      if (x > y) return 1; 
      return 0; 
     } 
    } 

    static void Main() 
    { 
     MyComparer comparer = new MyComparer(); 
     List<int> list = new List<int> { 1, 2, 3 }; 
     list.Sort(comparer); 
     return; 

    } 
} 

और उत्पादन होता है:

Compare(1, 2) 
Compare(1, 3) 
Compare(2, 3) 
Compare(1, 2) 
Compare(2, 2) 
Compare(2, 3) 
Compare(2, 2) 
+0

हम्म .. हाँ। तुलना() विधि की शुरुआत में एक कंसोल। राइटलाइन() जोड़ा गया। तुलना की गई सूची के लिए तुलना करें (2,2) दो बार बुलाया जाता है। – ForeverLearnNeverMaster

+0

+1 "मैंने इसे आज़माने के लिए एक टेस्ट प्रोग्राम लिखा था।" – iandisme

+0

मोनो 2.6.7.0 का उपयोग करके पुष्टि की। (लोगों ने अपने लिए प्रयास करने के लिए लोगों को आसान बनाने के लिए 'उपयोग' निर्देशों और 'लिखित रेखा' कथन को जोड़ने की स्वतंत्रता ली।) – Thomas

7

docs से:

इस विधि Array.Sort, जो quicksort एल्गोरिथ्म का उपयोग करता उपयोग करता है।

क्विकसॉर्ट कभी भी किसी आइटम की तुलना नहीं करेगा। क्विकसॉर्ट के कुछ कार्यान्वयन आइटम की तुलना स्वयं से करते हैं। यह तब भी हो सकता है जब वह आइटम आपकी सूची में एक से अधिक बार होता है।

किसी भी तरह से, आपके तुलनात्मक कार्य के लिए एक उचित, अच्छी तरह से व्यवहार तुलनात्मक कार्य होने के लिए, आपको अपने आप से तुलना की जा रही तत्वों के मामले को संभालने की आवश्यकता है।

+0

यह जॉनडी के उत्तर को कैसे समझाता है? क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है? – ForeverLearnNeverMaster

+0

यह उत्तर वोटिंग और v__v ऊपर जा रहा है। क्या कोई यहां बताए गए क्विकर्ट व्यवहार की पुष्टि कर सकता है, जो कि जॉनडी के नमूना कार्यक्रम के विपरीत है? – ForeverLearnNeverMaster

+0

हम्म, यह दिलचस्प है! मुझे खुशी है कि दोनों उत्तर शीर्ष के पास दिखाई देते हैं, अब जॉनडी को स्वीकार कर लिया गया है। उस स्थिति में, हमें निष्कर्ष निकालना होगा कि दस्तावेज़ गलत हैं। – Thomas

2

हालांकि यह सख्ती से गारंटी नहीं है, मुझे पूरा यकीन है कि सूची की सॉर्ट विधि किसी ऑब्जेक्ट की तुलना करने के लिए कभी भी आपकी तुलना विधि को कॉल नहीं करेगी जब तक वह ऑब्जेक्ट कई बार सूची में प्रकट न हो। मैं इस निष्कर्ष पर इस निष्कर्ष पर आधारित हूं कि List.Sort को क्विकॉर्ट एल्गोरिदम (एमएसडीएन के मुताबिक) का उपयोग करके कार्यान्वित किया गया है, जो कभी भी की तुलना नहीं करता है, आमतौर पर की तुलना उसी तत्व में नहीं करता है (और न ही दस्तावेजबद्ध सॉर्टिंग में से कोई भी एल्गोरिदम मैं सोच सकता हूं)। (संपादित करें: ऐसा लगता है कि माइक्रोसॉफ्ट के कार्यान्वयन के लिए ही तत्व तुलना स्वीकार किए जाते हैं जवाब ऊपर देखें।।)

हालांकि, अच्छा कोडन अभ्यास हुक्म है कि आपके IComparer कार्यान्वयन दोनों मानकों में एक ही वस्तु पारित किया जा रहा संभाल करने में सक्षम होना चाहिए, अन्यथा आपका कार्यान्वयन आईसीओएमपेयर द्वारा परिभाषित अनुबंध को पूरा नहीं कर रहा है। यह शायद आपके परिदृश्य के लिए काम करेगा, लेकिन आप सॉर्ट विधि (जो भविष्य में बदल सकता है) के कार्यान्वयन विवरण पर भरोसा करेंगे, और आप अन्य परिदृश्यों में आईसीओएमपेयर कार्यान्वयन का उपयोग नहीं कर पाएंगे, जहां ऐसा कोई नहीं है गारंटी (या बदतर, आप या कोई और इसका उपयोग करता है और संभवतः बग खोजने में मुश्किल बनाता है)।

1

एक और जवाब है, the XML part of ECMA-335 के आधार पर इस एक, बीसीएल के विनिर्देश (बेस कक्षा लाइब्रेरी)। यद्यपि वास्तविक कार्यान्वयन से संबंधित होने की गारंटी नहीं है, यह उतना ही आधिकारिक है जितना इसे प्राप्त होता है। और spec कुछ भी नहीं कहता है:

सबसे खराब, यह ऑपरेशन ओ (एन^2) है, जहां एन सॉर्ट करने के लिए तत्वों की संख्या है। औसतन यह ओ (एन लॉग एन) है।

हालांकि यह क्विकॉर्ट का सुझाव है, यह बिल्कुल गारंटी नहीं है। न ही Array.Sort के संदर्भ में spec को कार्यान्वयन की आवश्यकता होती है।

नीचे पंक्ति: जहां तक ​​spec का संबंध है, यह वस्तुओं की तुलना करने के लिए कार्यान्वयन के लिए बिल्कुल ठीक है।

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