使用lambda表达式的List.Sort

15

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

我猜这是因为在sort方法中没有针对范围的System.Comparison重载。这个重载被省略了,是否有特别的原因呢?

有没有一种简单的方法从Lambda表达式中获取合适的IComparer(就像一个可以直接使用的类,比如list.Sort(1, 2, new CompareyThing<int>((...) => ...)))?


我可能是个彻头彻尾的蠢货,但我不明白你想通过 list.Sort(1, 2, (i1, i2) => i1.CompareTo(i2) ); 实现什么。你能详细解释一下吗? - tmesser
这些整数只是举例而已。在我的实际代码中,我正在尝试比较一个类的整数属性。 - user673679
你可以使用以下代码 list.Sort(new Comparison<int>((i1, i2) => i1 - i2)); - Andrey Burykin
2个回答

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

5
如果您没有使用 .Net 4.5,可以创建自定义比较器:
class IntComparer : IComparer<int>
{
    public int Compare(int x, int y)
    {
        return x.CompareTo(y);
    }
}
list.Sort(1, 2, new IntComparer());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接