使用Lambda Expression的IComparer

jos*_*989 16 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)
 }
Run Code Online (Sandbox Code Playgroud)

这里List.sort需要一个IComparer<p>as参数.并且它与lambda一起使用,如第2行所示.但是当我尝试按照第1行的方式执行时,我收到此错误:

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

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

sep*_*p2k 19

当你这样做时ll.Sort((x, y) => x.Name.CompareTo(y.Name));,使用重载Comparison<T>,而不是IComparer.Comparison<T>是一个委托,所以你可以使用lambda表达式.

Comparison<p> mycomp = (x, y) => x.Name.CompareTo(y.Name); 将工作.

  • @duluca它在`System`命名空间中被定义为`public delegate int Comparison <in T>(T x,T y)`(减去.net 4之前版本中的`in`).它已在[此处](http://msdn.microsoft.com/en-us/library/tfakywbh%28v=vs.100%29.aspx)中记录. (2认同)

小智 5

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

这个使用.NET Framework 4.5中引入的Comparer <T> .Create.