使用lambda表达式代替IComparer参数

hau*_*ous 61 c# lambda icomparer

是否可以使用C#在方法调用中将lambda表达式作为IComparer参数传递?

例如

var x = someIEnumerable.OrderBy(aClass e => e.someProperty, 
(aClass x, aClass y) => 
  x.someProperty > y.SomeProperty ?  1 : x.someProperty < y.SomeProperty ?  -1 : 0);
Run Code Online (Sandbox Code Playgroud)

我不能完全把它编译成所以我猜不是,但看起来lambda和匿名代表之间的这种明显的协同作用让我觉得我必须做一些愚蠢的错误.

TIA

Jep*_*sen 72

如果您使用的是.NET 4.5,则可以使用静态方法Comparer<aClass>.Create.

文档:Comparer<T>.Create方法.

例:

var x = someIEnumerable.OrderBy(e => e.someProperty, 
    Comparer<aClass>.Create((x, y) => x.someProperty > y.SomeProperty ?  1 : x.someProperty < y.SomeProperty ?  -1 : 0)
    );
Run Code Online (Sandbox Code Playgroud)

  • @haughtonomous如果这是唯一阻止你的东西,你有没有考虑过倾销TFS而不是其他东西? (3认同)

Tim*_*lds 52

正如Jeppe指出的那样,如果您使用的是.NET 4.5,则可以使用静态方法Comparer<T>.Create.

如果没有,这是一个应该是等效的实现:

public class FunctionalComparer<T> : IComparer<T>
{
    private Func<T, T, int> comparer;
    public FunctionalComparer(Func<T, T, int> comparer)
    {
        this.comparer = comparer;
    }
    public static IComparer<T> Create(Func<T, T, int> comparer)
    {
        return new FunctionalComparer<T>(comparer);
    }
    public int Compare(T x, T y)
    {
        return comparer(x, y);
    }
}
Run Code Online (Sandbox Code Playgroud)