我试图用lambda表达式对列表的一部分排序,但在尝试排序时出错:
List<int> list = new List<int>();
list.Add(1);
list.Add(3);
list.Add(2);
list.Add(4);
// works fine
list.Sort((i1, i2) => i1.CompareTo(i2) );
// "Cannot convert lambda expression to type 'System.Collections.Generic.IComparer<int>' because it is not a delegate type"
list.Sort(1, 2, (i1, i2) => i1.CompareTo(i2) );
foreach (int i in list)
Console.WriteLine(i);
据猜测,这是因为没有系统。比较重载的排序需要一个范围。这是因为什么特殊的原因而省略的吗?
有没有一种简单的方法能从lambda表达式中得到一个合适的ICAMPARER(就像我只能用一个类去
list.Sort(1, 2, new CompareyThing<int>((...) => ...))
或什么)? 最佳答案
可以使用Comparer.Create方法,尽管在.NET 4.5中这似乎是新的。
list.Sort(1, 2, Comparer<int>.Create((i1, i2) => i1.CompareTo(i2)));
您可以创建自己的子文件夹:
public class FuncComparer<T> : IComparer<T>
{
private readonly Func<T, T, int> func;
public FuncComparer(Func<T, T, int> comparerFunc)
{
this.func = comparerFunc;
}
public int Compare(T x, T y)
{
return this.func(x, y);
}
}
那么你的代码是:
list.Sort(1, 2, new FuncComparer<int>((i1, i2) => i1.CompareTo(i2)));
关于c# - 具有lambda表达式的List.Sort,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13594475/