应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

基于接口的Sort排序方法原理

5774人阅读 2020/10/10 11:32 总访问:5182887 评论:0 收藏:1 手机
分类: .NET

集合提供了Sort,我们可以实现IComparer接口,来实现自定义的对象排序方法:

例如:根据年龄来排序

  1. public class MySort : IComparer<UserInfo>
  2. {
  3.     /// <summary>
  4.     /// 根据返回值来决定两个对象的大小
  5.     /// 如果等于0,表示两个对象相同就按照原序
  6.     /// 如果小于0,表示x小于y,前一个对象小于后一个对象
  7.     /// 如果大于0,表示x大于y,前一个对象大于后一个对象
  8.     /// </summary>
  9.     /// <param name="x"></param>
  10.     /// <param name="y"></param>
  11.     /// <returns></returns>
  12.     public int Compare(UserInfo x, UserInfo y)
  13.     {
  14.         if (x.Age > y.Age)
  15.             return 10;
  16.         else if (x.Age == y.Age)
  17.             return 0;
  18.         else
  19.         {
  20.             return -10;
  21.         }
  22.     }
  23. }

根据姓名长度来排序:

  1. class NameSort : IComparer<UserInfo>
  2. {
  3.     public int Compare(UserInfo x, UserInfo y)
  4.     {
  5.         return x.UserName.Length - y.UserName.Length;
  6.     }
  7. }

使用:

效果如下:



那么我们思考一下,基于接口排序的原理是什么呢?其实很简单就是随便写一个排序算法,然后调用这个接口里边提供的方法即可,根据返回的是正数,负数,还是0即可判断两个对象大小了
实现方法如下:

  1. public static void MyListSort<T>(List<T> numbers, IComparer<T> comparer)
  2. {
  3.     //任选一种排序算法,这里选择排序
  4.     for (int i = 0; i < numbers.Count - 1; i++)
  5.     {
  6.         for (int j = i + 1; j < numbers.Count; j++)
  7.         {
  8.             //只要找到比比较数大交换即可,这里具体的比较逻辑由接口来实现从而实现多态
  9.             if (comparer.Compare(numbers[i], numbers[j]) > 0)
  10.             {
  11.                 T temp = numbers[i];
  12.                 numbers[i] = numbers[j];
  13.                 numbers[j] = temp;
  14.             }
  15.         }
  16.     }
  17. }
  1. 这里具体的比较逻辑由接口来实现从而实现多态,依赖于抽象而不依赖于具体的实现,这种设计方法可以降低耦合性,提高扩展性


使用:

效果就不看了和使用原生的一模一样

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价