2008-10-23 16 views
17

का उपयोग कर सूचियों को सॉर्ट करने में समस्या मैं प्रतिनिधियों का उपयोग करके एक सूची क्रमबद्ध करने की कोशिश कर रहा हूं लेकिन मुझे हस्ताक्षर मिलान त्रुटि मिल रही है। कंपाइलर का कहना है कि मैं 'अज्ञात विधि' से परिवर्तित नहीं हो सकताप्रतिनिधि

List<MyType> myList = GetMyList(); 
myList.Sort(delegate (MyType t1, MyType t2) { return (t1.ID < t2.ID); }); 

मुझे क्या याद आ रही है?

यहां कुछ संदर्भ दिए गए हैं और वे इसे वही करते हैं।

Developer Fusion Reference

Microsoft Reference

उत्तर

46

मुझे लगता है कि आप चाहते हैं:

myList.Sort(delegate (MyType t1, MyType t2) 
    { return (t1.ID.CompareTo(t2.ID)); } 
); 

क्रमबद्ध करने के लिए आप के अलावा कुछ की जरूरत है "सही/गलत", आप, अपने बराबर है, तो करने के लिए पता करने की जरूरत की तुलना में अधिक है, या कम से कम।

+14

लैम्ब्डा में, यह हो जाएगा: 'myList.Sort ((T1, T2) => t1। ID.CompareTo (t2.ID)); ' – Jaider

10

क्रमबद्ध एक द्विआधारी विधेय नहीं ले करता है, यह एक Comparison<T> प्रतिनिधि जो एक int नहीं एक bool रिटर्न लेता है।

वापसी मान जब पहला आइटम दूसरे आइटम से अधिक है के लिए जब पहला आइटम दूसरे से कम है के लिए जब आइटम बराबर हैं के लिए 0, <0, और >0 हैं।

0

सुनिश्चित करें कि आपकी आईडी संपत्ति डिफ़ॉल्ट मान डेटा प्रकार है, जैसे Int या String। यदि आईडी एक ऑब्जेक्ट संदर्भ प्रकार है, तो उस ऑब्जेक्ट को IComparer या IComparer लागू करना चाहिए।

0

पिछली पोस्ट के लिए खेद है। संपादक < और > वर्ण नहीं लेता है, और मैंने संपादक के नीचे पूर्वावलोकन का ध्यान नहीं दिया। यदि आईडी प्रॉपर्टी ऑब्जेक्ट प्रकार है, तो ऑब्जेक्ट को आईसीओएमपेयर या आईसीओएमपेयर < टी > लागू करना चाहिए।

2

भविष्य में, अगर आप इस तरह डिबग समस्याओं करना चाहते हैं, मैं क्रमबद्ध कॉल से प्रतिनिधि परिभाषा को तोड़ते, इस तरह की वकालत चाहते हैं:

Comparison<MyType> c = delegate(MyType t1, MyType t2){ ... }; 
myList.Sort(c); 

इस तरह, आप अगर समस्या है देख सकते हैं आपके विधि कॉल में, या अपनी प्रतिनिधि परिभाषा में। कोड को और अधिक पठनीय बनाने के लिए कुछ लोग इसे इस तरह से छोड़ना पसंद करते हैं (स्पष्ट रूप से "सी" से अधिक वर्णनात्मक नाम के साथ)। मैं इसे ले सकता हूं या छोड़ सकता हूं = -)

0

obj.Sort (प्रतिनिधि (...)) का तरीका; एक जगह में गतिशील छंटनी है। यदि आपके पास एक ही सॉर्टिंग करने वाले कई स्थान हैं या आपको अधिक लचीला सॉर्टिंग की आवश्यकता है, तो आप आईसीओएमपेयर < टी > लागू करने वाले वर्ग को बनाने पर विचार कर सकते हैं। यहाँ एक उदाहरण है:

public class MyTypeComparer : IComparer<MyType> 
{ 
    public MyTypeComparer() // default comparer on ID 
    { ... } 

    public MyTypeComparer(bool desc) // default with order specified 

    public MyTypeComparer(string sort, bool desc) // specified sort and order such as property name, true or false. 
    { ... } 

    public int Compare(MyType a, MyType b) // implement IComparer interface 
    { ... } // this is real sorting codes 
} 

और यहाँ इसका इस्तेमाल करने के उदाहरण है:

List<MyType> myList = GetList(); 
myList.Sort(new MyTypeComparer()); 
// myList.Sort(new MyTypeComparer(false)); 
// myList.Sort(new MyTypeComparer("FirstName", true)); 
संबंधित मुद्दे