4

我想知道.Net 框架中是否提供了一个实现 IComparer 并且可以从 lambda 函数构造的类。能够做到这一点将很有用:

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

你为什么要让事情变得那么困难?

按长度排序列表很简单:

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

如果你真的需要那些复杂的东西,ComparationComparer 可以帮助你。请看这里:将比较转换为 icomparer

这是从 lamda 或委托构建 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 回答
3

我最终为常用方法(OrderBy、GroupBy 等)创建了额外的重载,以便为 IComparer 和 IEqualityComparer 获取 lambda:

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 回答
1

我认为你把事情复杂化了。

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