我有很多比较类,比较的类只是检查对象的name属性并进行字符串比较.例如:
public class ExerciseSorter : IComparer<Exercise>
{
public int Compare(Exercise x, Exercise y)
{
return String.Compare(x.Name, y.Name);
}
}
public class CarSorter : IComparer<Car>
{
public int Compare(Car x, Car y)
{
return String.Compare(x.Name, y.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
这个代码通用的最佳方法是什么,所以我不需要一遍又一遍地编写冗余代码.
Aar*_*ght 12
我使用这样的一个:
public class AnonymousComparer<T> : IComparer<T>
{
private Comparison<T> comparison;
public AnonymousComparer(Comparison<T> comparison)
{
if (comparison == null)
throw new ArgumentNullException("comparison");
this.comparison = comparison;
}
public int Compare(T x, T y)
{
return comparison(x, y);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
var carComparer = new AnonymousComparer<Car>((x, y) => x.Name.CompareTo(y.Name));
Run Code Online (Sandbox Code Playgroud)
如果你正在做一个直接的属性比较和属性类型实现IComparable(例如一个int或string),那么,我也有这个类使用更简洁:
public class PropertyComparer<T, TProp> : IComparer<T>
where TProp : IComparable
{
private Func<T, TProp> func;
public PropertyComparer(Func<T, TProp> func)
{
if (func == null)
throw new ArgumentNullException("func");
this.func = func;
}
public int Compare(T x, T y)
{
TProp px = func(x);
TProp py = func(y);
return px.CompareTo(py);
}
}
Run Code Online (Sandbox Code Playgroud)
这个用法是:
var carComparer = new PropertyComparer<Car, string>(c => c.Name);
Run Code Online (Sandbox Code Playgroud)
从 .NET 4.5 开始,不需要创建通用类来将Comparison<T>委托包装在IComparer<T>接口实现中。
该框架在类上提供静态Create方法,该方法接受一个委托并返回一个(实现)。Comparer<T>Comparison<T>Comparer<T>IComparer<T>
以下是如何使用它的示例:
// Sample comparison, any T will do.
Comparison<int> comparison = (x, y) => x.CompareTo(y)
// Get the IComparer.
IComparer<T> comparer = Comparer.Create(comparison);
Run Code Online (Sandbox Code Playgroud)
现在,您可以编写 lambda 表达式来执行您的比较,并快速将它们包装在不提供IComparer<T>接受Comparison<T>委托选项的实现中(例如class上的Sort方法)。List<T>