使用Lambda Expression的IComparer

时间:2010-05-23 19:46:27

标签: c#-3.0

 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>作为参数。它适用于lambda 如第2行所示。但是当我尝试按照第1行中的操作时,我收到此错误:

  

无法将lambda表达式转换为   类型   System.Collections.Generic.IComparer”   因为它不是委托类型

我调查了很长一段时间,但我仍然不明白。也许我对IComparer的理解不太好。可以有人帮我一把吗?

4 个答案:

答案 0 :(得分:19)

当您执行ll.Sort((x, y) => x.Name.CompareTo(y.Name));时,它会使用Comparison<T>的重载,而非IComparerComparison<T>是一个委托,因此您可以使用lambda表达式。

Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name);将有效。

答案 1 :(得分:5)

您可以参考的现有解决方案:https://stackoverflow.com/a/16839559/371531

这个使用.NET Framework 4.5中引入的Comparer&lt; T&gt; .Create。

答案 2 :(得分:2)

IComparer是一个接口,而不是委托。

您需要在其.CompareTo()上使用lambda表达式,而不是在接口本身上使用。

答案 3 :(得分: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);
    }
}