1. ホーム
  2. c#

[解決済み] IComparerの引数の代わりにlambda式を使用する

2023-04-16 15:35:21

質問

C#では、メソッド呼び出しのIComparerの引数としてラムダ式を渡すことは可能でしょうか?

例えば、次のようなものです。

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

しかし、ラムダと匿名デリゲートの間には明らかな相乗効果があるように思えるので、私は何か愚かな間違ったことをしているのだと感じています。

TIA

どのように解決するのですか?

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);
    }
}