首页 > 其他分享 >1.2 ICompare和IComparable

1.2 ICompare和IComparable

时间:2023-10-27 13:23:02浏览次数:34  
标签:IComparable 1.2 Age plist Person ICompare new public

C#排序和比较的实现

1.IComparable/IComparable

假设定义了一个数据,数据存放在List集合中,现在需要按 自己设想的排序规则来排序

static void Main(string[] args)
{
    Person p1 = new Person("Fuor", 28);
    Person p2 = new Person("Adain", 58);
    int r = p1.CompareTo(p2);
    Person p3 = new Person("Colo", 38);
    List<Person> plist = new List<Person>();
    plist.Add(p1);
    plist.Add(p2);
    plist.Add(p3);
    plist.Sort();
}
class Person 
{

    public string Name { get; set; }
    public int Age { get; set; }

    public Person() { }
    public Person(string name, int age)
    {
        this.Name = name;
        this.Age = age;
    }
}

如下图,直接报错,无法比较,因为Sort不知到需要按照什么规则来排序

//用 数据类型 实现接口IComparable,并在实现方法Compare(obj o)中定义好规则即可
class Person : IComparable<Person>
{
    public string Name { get; set; }
    public int Age { get; set; }
    
    public Person() { }
    public Person(string name, int age)
    {
        this.Name = name;
        this.Age = age;
    }
    public int CompareTo(Person p)
    {
        if (this.Age == p.Age)
        {
            return 0;
        }
        else if (this.Age < p.Age)
            return -1;
        else
            return 1;
    }
}

//未实现IComparable接口时候,此方法报错,无法使用
Person p1 = new Person("Fuor", 28);
Person p2 = new Person("Adain", 58);
//实现接口后,可以调用CompareTo() 来比较两个对象
int result = p1.CompareTo(p2);

public int CompareTo(object obj)
{
   Person p = obj as Person;
    if (this.Age == p.Age)
    {
        return 0;
    }
    else if (this.Age < p.Age)
        return -1;
    else
        return 1;
}

2.ICompare/ICompare

问题2,虽然有默认的排序了,但是在某些特定的情景下,我需要采用其他的排序规则呢?

此时ICompare就出现了,所以ICompare/ICompare 其实就是解决特定情况 下,用户除了默认的排序外还需要特殊的排序规则,此时就需要自定义一个新的排序规则

static void Main(string[] args)
{
    Person p1 = new Person("Fuor", 28);
    Person p2 = new Person("Adain", 58);

    Person p3 = new Person("Colo", 38);
    List<Person> plist = new List<Person>();
    plist.Add(p1);
    plist.Add(p2);
    plist.Add(p3);

    PersonCompare personCompare = new PersonCompare();
    personCompare.Compare(p1, p2);

    //指定自定义的比较器 来排序
    plist.Sort(0, plist.Count, personCompare);//如果是需要指定 不是默认比较实现的 比较器

    Console.WriteLine();
    Console.ReadKey();
}
//继承ICompare 需要实现Compare方法,然后将比较器传入需要使用的地方即可
class PersonCompare : IComparer<Person>//ICompare<T> 可以限定传入的类型
{
    public int Compare(Person x, Person y)
    {
        if (x.Name.First() > y.Name.First())
            return 1;
        else if (x.Name.First() < y.Name.First())
            return -1;
        else
            return 0;
    }
}

标签:IComparable,1.2,Age,plist,Person,ICompare,new,public
From: https://www.cnblogs.com/MurphyCreo/p/17791284.html

相关文章

  • druid 1.2.20发布,增强对Spring-boot-3-starter的支持
    导读这个版本修复大家比较关注的对spring-boot3的支持问题。大家按需升级Issues修复druid-spring-boot-3-starter错误,并增加自动配置的适配文件#5437#5443针对mysqlloadbalance格式的url,加上connectTimeout等属性的识别支持#5396修复socketTimeout参数不支持mysq......
  • Linux Mint 21.2 “EDGE” ISO 发布
    Linux Mint团队近日宣布发布最新LinuxMint21.2“Victoria“版本的“EDGE“ISO版本,并提供下载。“这个镜像是为那些硬件太新而无法启动LinuxMint21.x中包含的5.15LTS内核的用户制作的。LinuxMint21.2“Victoria“于2023年7月中旬发布,基于Ubuntu22.0......
  • 我的世界1.20.1模组开发---3.数据生成
    介绍  我们在模组里每添加一个物品或方块后,在游戏里显示的都只是马赛克,因为我们还没有为我们的物品或方块设置对应的模型贴图。我的世界游戏里,每一个物品和方块我们所看到的样子都是一张张贴图,就是画的像素画,贴在了一个模型表面。我们想设置对应的贴图,需要写一个对应的json文件......
  • 模拟集成电路设计系列博客——3.1.2 参考电路
    3.1.2参考电路已知绝对值的电压和电流在集成电路的交互处,或者是集成电路和其他分立部件之间是最有用的。例如,两个集成电路需要交互时,规定通过一伏摆幅的信号来进行。参考电压或者电流优势从电源中分配而出,但电源并不重组有着充足的控制精度,这种情况下参考电压或者参考电流就需要......
  • rustdesk 1.2.3-1 尝鲜,有很大提升空间
    产品说的很好。测试了一下电脑从archlinuxcn下的rustdesk1.2.3-1,手机端fdroid下的,版本是1.1.10-1,同一局域网,未自建服务器。电脑端启动后显示账号和一次性密码。手机输入账号密码后连接,手机画面黑屏,过一回依旧黑屏不显示,再一会断联。手机可选显示哪个桌面(一共两)。密码刷新后......
  • Kubeadm安装高可用k8s 1.23.x
    Kubeadm安装高可用k8s1.23.x本篇文章参考杜宽的《云原生Kubernetes全栈架构师》,视频、资料文档等,大家可以多多支持!1.高可用架构1.1架构图Kubernetes是属于主从设备模型(Master-Slave架构),即有Master节点负责核心的调度、管理和运维,Slave节点则执行用户的程序。在Kubernetes中,主节......
  • 安装kubernetes-v1.26.9集群,安装配置calico网络
    安装kubernetes-v1.26.9集群,安装配置calico网络1、配置基础环境1、资源规划一共三台主机,安装配置一个master01,两个worker01master01:192.168.2.10worker01:192.168.2.11worker02:192.168.2.12镜像仓库服务器:192.168.2.20VMware虚拟机规格:CentOSLinux7(Core)2核CPU、3G内......
  • 部署Nginx1.23脚本
    #!/bin/bashck_ok(){    if[$?-ne0]    then        echo"$1error."        exit1    fi}download_ng(){  cd /usr/local/src  if[-fnginx-1.23.0.tar.gz]  then    echo"当前目录已......
  • 【2023潇湘夜雨】WIN11_Pro_23H2.22631.2428软件选装纯净版10.12
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_23H2.22631.2428。2.增加部分优化方案,手工精简部分较多。3.OS版本号为22631.2428。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.13.0.8》网卡版、......
  • DPDK-22.11.2 [五] 多进程
    dpdk支持多进程运行,不过要指定参数打开,如果没有设定,但开启第二个dpdk程序是会报错,告诉你相关系统资源被占用。EAL:Cannotcreatelockon'/var/run/dpdk/rte/config'.Isanotherprimaryprocessrunning?EAL:FATAL:CannotinitconfigEAL:Cannotinitconfigdpdk有两......