gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:04:04 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com