4

IComparer を実装し、ラムダ関数から構築できる .Net フレームワークで提供されるクラスがあったかどうか疑問に思っています。それができると便利です:

void SortByLength(List<string> t)
{
    t = t.OrderBy(
           s => s, 
           Comparer<string>.FromLambda((s1,s2) => s1.Length.CompareTo(s2.Length))
        ).ToList();
}

毎回 Comparer クラスを定義するよりもはるかに簡単です。このような FromLambda メソッドを作成するのは複雑ではないことはわかっていますが、これはかなり一般的な機能であると考えているため、フレームワークに既存の方法があるかどうか疑問に思っていました。

4

4 に答える 4

5

他の回答は、.NET 4.5 のリリース前のものです。しかし、.NET 4.5 (Visual Studio 2012) の BCL では、単に次のように言えます。

Comparer<string>.Create((s1,s2) => s1.Length.CompareTo(s2.Length))

Comparer<T>.Createドキュメントを参照してください。

于 2012-09-05T21:00:47.440 に答える
3

IComparerとIEqualityComparerのラムダを取得するために、一般的なメソッド(OrderBy、GroupByなど)に追加のオーバーロードを作成することになりました。

public static class EnumerableExtensions
{
    public static IEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, TKey, int> comparer)
    {
        return source.OrderBy(keySelector, new GenericComparer<TKey>(comparer));
    }

    private class GenericComparer<T> : IComparer<T>
    {
        private readonly Func<T, T, int> comparer;

        public GenericComparer(Func<T, T, int> comparer)
        {
            this.comparer = comparer;
        }

        public int Compare(T x, T y)
        {
            return this.comparer(x, y);
        }
    }
}
于 2012-07-18T13:20:11.830 に答える
3

なんでそんなに難しくするの?

長さでリストを並べ替えるのは、次のように簡単です。

var ordered = list.OrderBy(s => s.Length);

本当に複雑なものが必要な場合は、ComparisonComparer が役に立ちます。こちらをご覧ください:比較を icomparer に変換する

これは、ラムダまたはデリゲートから IComparer を構築しています!

その例の本質的なコードは次のとおりです

public class ComparisonComparer<T> : IComparer<T>  
{  
    private readonly Comparison<T> _comparison;  

    public ComparisonComparer(Comparison<T> comparison)  
    {  
        _comparison = comparison;  
    }  

    public int Compare(T x, T y)  
    {  
        return _comparison(x, y);  
    }  
}  
于 2012-07-18T13:17:04.000 に答える
1

あなたは物事を複雑にしすぎていると思います。

void SortByLength(List<string> t) 
{ 
    t = t.OrderBy( 
           s => s.Length
        ).ToList();     
} 
于 2012-07-18T13:18:13.663 に答える