我想知道.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方法并不复杂,但我想知道框架中是否存在现有方法,因为我认为这是一个非常常见的特性。
答案 0 :(得分: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);
}
}
答案 1 :(得分:3)
其他答案来自.NET 4.5发布之前。但是使用.NET 4.5的BCL(Visual Studio 2012),您只需说
Comparer<string>.Create((s1,s2) => s1.Length.CompareTo(s2.Length))
答案 2 :(得分:2)
我最终为常用方法(OrderBy,GroupBy等)创建了额外的重载,以便为IComparer和IEqualityComparer采用lambdas:
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);
}
}
}
答案 3 :(得分:1)
我认为你过于复杂化了。
void SortByLength(List<string> t)
{
t = t.OrderBy(
s => s.Length
).ToList();
}