List.Sort 与 lambda 表达式

Posted

技术标签:

【中文标题】List.Sort 与 lambda 表达式【英文标题】:List.Sort with lambda expression 【发布时间】:2012-11-15 16:17:10 【问题描述】:

我正在尝试使用 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&lt;int&gt;((...) =&gt; ...)) 或其他东西的类)?

【问题讨论】:

我可能是个彻头彻尾的笨蛋,但我不明白你想用list.Sort(1, 2, (i1, i2) =&gt; i1.CompareTo(i2) ); 完成什么。你能详细说明一下吗? 整数仅用于示例目的。在我的实际代码中,我试图比较一个类的 int 属性。 您可以使用以下代码list.Sort(new Comparison&lt;int&gt;((i1, i2) =&gt; i1 - i2)); 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

class IntComparer : IComparer<int>

    public int Compare(int x, int y)
    
        return x.CompareTo(y);
    

list.Sort(1, 2, new IntComparer());

【讨论】:

以上是关于List.Sort 与 lambda 表达式的主要内容,如果未能解决你的问题,请参考以下文章

使用Lambda表达式扩展List.Sort()

python-list.sort && lambda

Java 8 Comparator 类型推断非常困惑

Lambda 函数与表达式

python学习 -- operator.itemgetter(), list.sort/sorted 以及lambda函数

一文读懂C++11的Lambda表达式的用法与原理