List.Sort with lambda expression

时间:2012-11-27 22:39:06

标签: c# list sorting delegates lambda

我正在尝试使用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);

猜测这是因为对于需要范围的排序没有System.Comparison重载。这是否因任何特殊原因而被省略?

是否有一种简单的方法可以从lambda表达式中获取合适的IComparer(就像我可以使用的类list.Sort(1, 2, new CompareyThing<int>((...) => ...))或其他东西一样)?

2 个答案:

答案 0 :(得分:17)

您可以使用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)));

答案 1 :(得分:4)

如果您不使用.Net 4.5,则可以创建自定义比较器:

class IntComparer : IComparer<int>
{
    public int Compare(int x, int y)
    {
        return x.CompareTo(y);
    }
}
list.Sort(1, 2, new IntComparer());