基于接口的Sort排序方法原理
电脑版发表于:2020/10/10 11:32
集合提供了Sort,我们可以实现IComparer接口,来实现自定义的对象排序方法:
例如:根据年龄来排序
public class MySort : IComparer<UserInfo> { /// <summary> /// 根据返回值来决定两个对象的大小 /// 如果等于0,表示两个对象相同就按照原序 /// 如果小于0,表示x小于y,前一个对象小于后一个对象 /// 如果大于0,表示x大于y,前一个对象大于后一个对象 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> public int Compare(UserInfo x, UserInfo y) { if (x.Age > y.Age) return 10; else if (x.Age == y.Age) return 0; else { return -10; } } }
根据姓名长度来排序:
class NameSort : IComparer<UserInfo> { public int Compare(UserInfo x, UserInfo y) { return x.UserName.Length - y.UserName.Length; } }
使用:
效果如下:
那么我们思考一下,基于接口排序的原理是什么呢?其实很简单就是随便写一个排序算法,然后调用这个接口里边提供的方法即可,根据返回的是正数,负数,还是0即可判断两个对象大小了
实现方法如下:
public static void MyListSort<T>(List<T> numbers, IComparer<T> comparer) { //任选一种排序算法,这里选择排序 for (int i = 0; i < numbers.Count - 1; i++) { for (int j = i + 1; j < numbers.Count; j++) { //只要找到比比较数大交换即可,这里具体的比较逻辑由接口来实现从而实现多态 if (comparer.Compare(numbers[i], numbers[j]) > 0) { T temp = numbers[i]; numbers[i] = numbers[j]; numbers[j] = temp; } } } }
这里具体的比较逻辑由接口来实现从而实现多态,依赖于抽象而不依赖于具体的实现,这种设计方法可以降低耦合性,提高扩展性
使用:
效果就不看了和使用原生的一模一样