开发者

IComparer using Lambda Expression

 class p {
     public string Name开发者_如何学JAVA { 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)
 }

Here the List.sort expects an IComparer<p> as parameter. And it works with the lambda as shown in Line 2. But when I try to do as in Line 1, I get this error:

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

I investigated this for quite some time but I still don't understand it.Maybe my understanding of IComparer is not quite good.Can somebody give me a hand ?


When you do ll.Sort((x, y) => x.Name.CompareTo(y.Name)); it uses the overload for Comparison<T>, not IComparer. Comparison<T> is a delegate, so you can use a lambda expression for it.

Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); will work.


There's an existing solution you might refer to: https://stackoverflow.com/a/16839559/371531

This one uses Comparer<T>.Create introduced in .NET Framework 4.5.


IComparer is an interface, not a delegate.

You'll want to use the lambda expression on its .CompareTo(), not on the interface itself.


Use the following simple class:

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);
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜