2012-07-18 48 views
4

我想知道如果有.net框架提供的类实现IComparer,并可以从lambda函数构造。 这将是有用的,能够做到:如何轻松地从lambda函数创建比较器?

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

这会比每次都定义了一个比较器类容易得多。 我知道创建这样一个FromLambda方法并不复杂,但我想知道在框架中是否存在一种方法,因为我认为这是一个非常常见的功能。

+0

不,框架中没有这样的东西,但它很容易实现。 – Rafal 2012-07-18 13:17:31

+0

但是有这样的事情...... – 2012-07-18 13:24:36

+0

@Rafal你**是完全正确的,但随着框架新版本的改变(见我的新答案)。 – 2012-09-05 21:02:57

回答

3

你为什么会这么难?

排序方式长名单很简单,只要:

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

如果你真的很需要那复杂的东西,在ComparisonComparer 可以帮助你。请看看这里:Converting Comparison to 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); 
    } 
} 
+0

这是一个例子。你可以有更复杂的事情,真的需要一个lambda – 2012-07-18 13:23:23

+0

你给我-1 ...先看看链接,它明确地解决了问题 – 2012-07-18 13:23:44

+0

@MareInfinitus我不相信它。它基本上不接受Func的问题。 – 2012-07-18 13:27:37

1

我认为你是在复杂的事物的本质代码。

void SortByLength(List<string> t) 
{ 
    t = t.OrderBy( 
      s => s.Length 
     ).ToList();  
} 
+0

,这就是为什么我+1了你的答案。但是,当我把我的地址放在 – 2012-07-18 13:25:02

+0

已经说过,这是一个代表O.o – scottheckel 2012-07-18 13:30:35

+0

的时候,你的确不在。 +1 so – 2012-07-18 13:33:29

2

我结束了创建的常用方法(排序依据,的GroupBy等)额外重载采取lambda表达式为的IComparer和的IEqualityComparer:

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

确实很有用,谢谢! – 2012-07-18 13:25:55

+0

@ d - b可以自由接受答案,如果你发现它回答你的问题。 – 2012-07-18 13:26:47

3

其他的答案是从之前发布的。 NET 4.5。但随着.NET 4.5(的Visual Studio 2012)首创置业,你干脆说

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

Comparer<T>.Create documentation

相关问题