c# - 拥有通用比较器的最佳方法是什么

标签 c# generics

我有很多比较器类,其中被比较的类只是检查对象的名称属性并进行字符串比较。例如:

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

使此代码通用的最佳方法是什么,这样我就不需要一遍又一遍地编写冗余代码。

最佳答案

我用的是这样的:

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

用法:

var carComparer = new AnonymousComparer<Car>((x, y) => x.Name.CompareTo(y.Name));

如果您正在进行直接属性比较并且属性类型实现了 IComparable(例如 intstring),那么,我也有这个类,使用起来更简洁:

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

这个的用法是:

var carComparer = new PropertyComparer<Car, string>(c => c.Name);

关于c# - 拥有通用比较器的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2557894/

相关文章:

c# - 我们如何返回用户在 webBrowser 控件中单击的按钮的名称?

c# - 无法杀死的进程

c# - 是否有命令将 nuget.exe 指向特定的 NuGet.Config 文件?

c# - 反编译.pdb文件C#(程序数据库)

c# - 如何在 Visual Studio 中调试时查看 ViewBag 内容?

swift - 使用通用 where 条件和指定参数类型有什么区别?

java - 仅对某些方法要求 `T extends Comparable<T>`

c# - 泛型上的 InvalidCastException

java - 泛型混淆

json - Swift 条件符合两种情况