2009-11-20 14 views
8

मैं सिर्फ एक वेबसाइट से यह टुकड़ा उठा लिया और यह वास्तव में समाधान मैं अपने विशेष समस्या के लिए आवश्यक साबित हुई।ठीक है, यह काम किया। हकीकत में यह क्या है?

मैं पता नहीं कि यह क्या है है (विशेष रूप से प्रतिनिधि और भागों वापसी) और स्रोत यह स्पष्ट नहीं होता।

अतः आशा मुझे प्रबुद्ध कर सकते हैं।

myList.Sort( delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
       { 
       return x.Value.CompareTo(y.Value); 
       } 
      ); 
+8

+1 यह समझने के लिए कि आप जो अगले स्निपेट पर जाते हैं उसे बदलने के बजाय आप क्या कर रहे हैं उसे समझना चाहते हैं। –

+0

एक उत्तर स्वीकार करने के लिए मत भूलना। –

उत्तर

11

MyList.Sort एक पैरामीटर है - समारोह है कि आइटम की तुलना के लिए जिम्मेदार है, इसलिए सूची में यह करने के लिए accoding हल हो सकता है।

अगला: प्रतिनिधि (एक्स, वाई) समारोह में ही किस प्रकार KeyValuePair [स्ट्रिंग, Int32] के दो पैरामीटर स्वीकार परिभाषित करता है।

return x.Value.CompareTo(y.Value); 

जो this definition के अनुसार 2 पूर्णांक मूल्यों तुलना:

कोष्ठक {...} में सामग्री वास्तविक comparisson तर्क है।

इस प्रकार अपनी सूची accending क्रम में उन लोगों के पूर्णांक मान के आधार पर क्रमबद्ध किया जाएगा।


के साथ सी # 3.5 मैं इस तरह यह पुनर्लेखन होगा:

mylist.Sort((x,y) => x.Value.CompareTo(y.Value)); 
+0

सी # 3.0 के साथ, क्या यह कोड छोटा हो सकता है? – Chris

+0

हां। मैंने जवाब अपडेट किया। –

+0

तो हुड के तहत, मुझे लगता है कि इस तरह कुछ ऐसा चल रहा है: इस सूची में प्रत्येक कीवाल्वायर के लिए, वर्तमान कीवालुएप में 'मान' आइटम की तुलना करें, अगले कीवैलपैयर में 'मान' आइटम के साथ 'मूल्य' आइटम की तुलना करें। जो अधिक है वह एक स्लॉट को दूसरे की तुलना में अधिक रखा जाता है। -मैं बंद हूं? – fieldingmellish

0

यह एक तरह से समारोह एक सूची और बात पर कहा कि इसे में पारित किया जा रहा है एक प्रतिनिधि जो द्वारा क्रमबद्ध कहा जाता है() वास्तव में दो तत्वों के बीच तुलना करने के लिए।

MSDN समारोह पर पेज http://msdn.microsoft.com/en-us/library/0e743hdt.aspx

0
myList.Sort //Sort using a your own compare function 
    (
    // declare the compare function, returns a int, and receives two items 
    delegate(KeyValuePair<String, Int32> x, KeyValuePair<String, Int32> y) 
    { 
     // returns a int indicating whether the items are "equal" - equal being what is implemented it the appropriate compare function. 
     return x.Value.CompareTo(y.Value); 
    } 
); 
+2

मेरा मानना ​​है कि यह वास्तव में एक int लौटाता है, 0 बराबर होता है, 0 से कम x y – Davy8

+2

यह आईएनटी देता है, नहीं बूलेन! –

0

इस तरह से इसके बारे में सोचो।

public int MyComparisonMethod(KeyValuePair<string, int> x, KeyValuePair<string,int> y) 
{ 
    return x.Value.CompareTo(y.Value); 
} 

यह मूल रूप से दो मानों का उपयोग करें, और उन्हें तुलना: यदि आप एक विधि है कि इस तरह देखा था कहो। यह -1, 0 या 1 देता है, यदि x क्रमशः y से कम या बराबर है।

अब, कवर के तहत, List.Sort त्वरित क्रमबद्ध एल्गोरिथ्म का इस्तेमाल किया। आपको समझने की जरूरत है कि यह एक दूसरे के खिलाफ आपकी सूची में विभिन्न तत्वों की तुलना करता रहता है। यह कैसे पता चलता है कि मान मूल्य बी से कम या उसके बराबर है या नहीं? यह इस विधि को कॉल करता है, और उस पर आधारित, यह जानता है। समझ में आता है?

तो विचार, आप अपनी सूची में दो मानों की तुलना के लिए एक तंत्र प्रदान करते हैं एक List.Sort कि का उपयोग करता है की तुलना में यह छँटाई के लिए की जरूरत है ऐसा करने के लिए है।

0

बस एक FYI करें,

यह आमतौर पर मामले में प्रयोग किया जाता है आप कस्टम कक्षाओं की एक सूची सॉर्ट करने के लिए की जरूरत है।

उदा।

class Student 
{ 
    int rollID; 
    string name; 
} 

List<Student> students = new List<Student>(); 

... 

students.Sort(delegate(Student x, Student y) { return x.rollID.CompareTo(y.rollID);}); 
0

यह अंतर्निहित है, लेकिन हो सकता है आप अपने "MyList" की घोषणा का उल्लेख किया जाना चाहिए था। मुझे इसे आपके लिए लिखने दें।

var myList=new List<KeyValuePair<string, int>>(); 

अब, इसका अर्थ यह है कि इस सूची में प्रत्येक आइटम KeyValuePair [string, int] का एक उदाहरण है।

अब, आपके प्रश्न पर आ रहा है।

सॉर्ट विधि के ओवरलोड में से एक "तुलना" प्रतिनिधि स्वीकार करता है, जो संग्रह के दो आइटम लेता है और एक पूर्णांक संख्या देता है।

public delegate int Comparison<T>(T x, T y) 

अनिवार्य रूप से, तुम क्या कर रहे एक अनाम प्रतिनिधि जो दो आइटम तुलना पैदा कर रही है (आपके मामले में, आप 'मान' पर छँटाई कर रहे हैं आप कर सकते हैं भी प्रकार पर 'कुंजी') की "compareTo" पद्धति का उपयोग करके IComparable (स्ट्रिंग और int इस इंटरफेस को लागू)।

IComparable.Compare एक पूर्णांक देता है (जो आपकी सूची में वस्तुओं को व्यवस्थित करने के लिए सॉर्ट विधि द्वारा उपयोग किया जाता है) यह बताता है कि lhs (-1) से कम है, (1) या बराबर (0) rhs से बड़ा है।

एफवाईआई: यदि आप सी # 3.0 पर काम कर रहे हैं, तो आपको अज्ञात प्रतिनिधि की भी आवश्यकता नहीं है। आप लैम्ब्डा अभिव्यक्ति के बजाय का उपयोग कर सकते हैं (यह गुमनाम प्रतिनिधि परिभाषित करने के लिए एक आशुलिपि, more? है)

जैसे:

myList.Sort((x, y) => x.Value.CompareTo(y.Value)); 
//Sort over Value 

myList.Sort((x, y) => x.Key.CompareTo(y.Key)); 
//Sort over key 

आशा स्पष्टीकरण उपयोगी है।

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