我试图用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/

10-11 18:14