2010-05-23 28 views
15
class p { 
    public string Name { get; set; } 
    public int Age { get; set; } 
}; 

static List<p> ll = new List<p> 
{ 
    new p{Name="Jabc",Age=53},new p{Name="Mdef",Age=20}, 
    new p{Name="Exab",Age=45},new p{Name="G123",Age=19} 
}; 
protected static void SortList() 
{ 
    IComparer<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); <==(Line 1) 
    ll.Sort((x, y) => x.Name.CompareTo(y.Name));<==(Line 2) 
} 

का उपयोग कर आईसीओएमपेयर यहां List.sort पैरामीटर के रूप में IComparer<p> की अपेक्षा करता है। और यह लैम्ब्डा साथ काम करता है के रूप में लाइन 2 में दिखाया गया है लेकिन जब मैं पंक्ति 1 में के रूप में करने की कोशिश, मैं इस त्रुटि मिलती है:लैम्ब्डा अभिव्यक्ति

Cannot convert lambda expression to type System.Collections.Generic.IComparer' because it is not a delegate type

मैं पिछले कुछ समय से इस जांच की लेकिन मैं अभी भी समझ में नहीं आता यह। शायद आईसीओएमपेयर की मेरी समझ काफी अच्छी नहीं है। क्या कोई मुझे हाथ दे सकता है?

उत्तर

19

जब आप करते हैं तो यह Comparison<T> के लिए अधिभार का उपयोग करता है, IComparer नहीं। Comparison<T> एक प्रतिनिधि है, इसलिए आप इसके लिए लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं।

Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); काम करेगा।

+0

तुलना कहां से/कैसे है? –

+2

@duluca इसे 'सिस्टम' नेमस्पेस में 'सार्वजनिक प्रतिनिधि int तुलना (टी एक्स, टी वाई)' के रूप में परिभाषित किया गया है (.net 4 से पहले संस्करणों में 'in'' घटाएं)। यह दस्तावेज [यहां] (http://msdn.microsoft.com/en-us/library/tfakywbh%28v=vs.100%29.aspx) है। – sepp2k

+0

'तुलना करें()' एक संस्कृति विशिष्ट तुलना है। कुछ 'll.sort ((x, y) => स्ट्रिंग। कॉम्पारेऑर्डिनल (x.Name, y.Name))' कुछ बेहतर हो सकता है। –

2

आईसीओएमपेयर एक इंटरफेस है, प्रतिनिधि नहीं।

आप लैम्ब्डा अभिव्यक्ति का उपयोग करना चाहते हैं। कॉम्पैयर टू(), इंटरफ़ेस पर नहीं।

1

उपयोग निम्नलिखित सरल वर्ग:

public static class ComparerUtilities 
{ 
    class _Comparer<T> : Comparer<T> 
    { 
     Comparison<T> _comparison; 

     public _Comparer(Comparison<T> comparison) 
     { 
      _comparison = comparison; 
     } 

     public override int Compare(T x, T y) 
     { 
      return _comparison(x, y); 
     } 
    } 

    public static IComparer<T> FromComparison<T>(Comparison<T> comparison) 
    { 
     return new _Comparer<T>(comparison); 
    } 
} 
4

एक मौजूदा समाधान आप भी दिखाई दे सकता है: https://stackoverflow.com/a/16839559/371531

यह एक comparer < का उपयोग करता है टी> .Create .NET फ्रेमवर्क 4.5 में पेश किया।

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