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的理解不太好。可以有人帮我一把吗?
答案 0 :(得分: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);
将有效。
答案 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);
}
}