剑轩

基于接口的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;
            }
        }
    }
}
这里具体的比较逻辑由接口来实现从而实现多态,依赖于抽象而不依赖于具体的实现,这种设计方法可以降低耦合性,提高扩展性


使用:

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

关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢