C#中Comparer<T>、IComparer<T>与Comparison<T>的关联及复用问询
实现多比较方式的通用数组排序方法(避免重复逻辑)
核心思路:复用单一排序逻辑
所有重载方法都委托到同一个核心排序方法,通过类型转换把不同的比较器/委托统一成IComparer<T>类型,彻底避免重复编写排序代码。
关键转换规则
Comparer<T>↔IComparer<T>:Comparer<T>本身就实现了IComparer<T>接口,所以Comparer<T>实例可以直接当作IComparer<T>使用(编译器会自动完成隐式转换)。- 若要把
IComparer<T>转成Comparer<T>,用Comparer<T>.Create包装它的Compare方法即可:IComparer<T> customIComparer = new MyCustomComparer<T>(); Comparer<T> comparer = Comparer<T>.Create((x, y) => customIComparer.Compare(x, y));
Comparison<T>→Comparer<T>:
用你已知的Comparer<T>.Create(comparison)直接转换即可。
完整实现代码
// 核心排序方法:所有重载都调用这个,只在这里写一次排序逻辑 public T[] Sort<T>(T[] toSort, IComparer<T> comparer) { // 克隆原数组,避免修改输入的原数组(无副作用设计) T[] sortedArray = (T[])toSort.Clone(); // 这里用Array.Sort作为基础排序实现,你也可以替换成自己写的排序算法(比如快速排序、冒泡排序) Array.Sort(sortedArray, comparer); return sortedArray; } // 重载1:T实现IComparable<T>的默认排序 public T[] Sort<T>(T[] toSort) where T : IComparable<T> { // 使用默认比较器,自动调用T的CompareTo方法 return Sort(toSort, Comparer<T>.Default); } // 重载2:接收Comparer<T>类型的比较器 public T[] Sort<T>(T[] toSort, Comparer<T> comparer) { // 直接转成IComparer<T>传给核心方法(隐式转换,编译器自动处理) return Sort(toSort, comparer); } // 重载3:接收Comparison<T>委托 public T[] Sort<T>(T[] toSort, Comparison<T> comparison) { // 把委托转成Comparer<T>再传给核心方法 return Sort(toSort, Comparer<T>.Create(comparison)); }
补充说明
- 克隆数组的原因:如果直接排序原数组,会修改调用者传入的数组,属于不友好的副作用;返回新数组更符合常规使用预期。
- 排序逻辑可替换:核心方法里的
Array.Sort可以替换成你自己实现的排序算法,所有重载会自动复用新逻辑,无需逐个修改。
内容的提问来源于stack exchange,提问作者Svetlana
相关产品推荐
相关产品推荐

