惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
C
Check Point Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
F
Full Disclosure
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
博客园 - 司徒正美
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
云风的 BLOG
云风的 BLOG
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
雷峰网
雷峰网
V
V2EX - 技术
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Spread Privacy
Spread Privacy
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security Affairs
SecWiki News
SecWiki News
Schneier on Security
Schneier on Security
O
OpenAI News
Jina AI
Jina AI
PCI Perspectives
PCI Perspectives
Cyberwarzone
Cyberwarzone
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog RSS Feed
I
InfoQ
D
Docker
P
Palo Alto Networks Blog
Recorded Future
Recorded Future
M
MIT News - Artificial intelligence
博客园 - Franky
B
Blog
Scott Helme
Scott Helme
博客园 - 叶小钗
D
DataBreaches.Net

博客园 - 老金

直接初始化和复制初始化 C++ 内连接与外连接 (转) mysql-Innodb事务隔离级别-repeatable read详解(转) Linux操作系统多线程信号总结 Linux操作系统多线程信号总结(转) 转-C/C++捕获段错误,打印出错的具体位置(精确到哪一行) 关键字restrict简介 使用SMTP 和POP3 协议实现收发邮件(C/C++) (转) C/C++中的日期和时间 time_t与struct tm - 老金 Unicode(UTF-8, UTF-16)令人混淆的概念 跟着url走一圈(ASP.NET请求底层流转个人总结 二) 跟着url走一圈(ASP.NET请求底层流转个人总结 一) GDB教程详解&打印STL容器 C# 中的"yield"使用 谈谈.Net中的协变和逆变(转) jsoncpp在linux下的配置 在Ubuntu上安装并C++使用libmemcached C++ Primer 第十六章 模板与范型编程 C++ Primer 第十五章 面向对象编程
对象的比较与排序:IComparable和IComparer接口
老金 · 2012-07-09 · via 博客园 - 老金

IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口提供一个返回值类似(大于0 等于0 小于0)的比较方法,二者区别如下:

1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象。

2. IComparer 在一个单独的类中实现,可以比较任意两个对象。

先看 IComparable  这个接口方法是 int CompareTo(object obj); 方法只有一个参数,我们知道比较至少要有两个对象,所以这个方法只能应用在要比较的对象类中,参数传递的对象就可以和 this 做比较。

class obj : IComparable<obj>
{
    public int age = 10;

    public int CompareTo(obj other)
    {
        //return this.age.CompareTo(other.age); 
        
//下面代码是此方法的具体实现 

        if (this.age == other.age)
        {
            return 0;
        }
        else if (this.age > other.age)
        {
            return 1;
        }
        else
        {
            return -1;
        }
    }
}

static void Main(string[] args)
{
    obj a = new obj();
    obj b = new obj();

    a.CompareTo(b); // 0

    a.age = 20;
    a.CompareTo(b); // 1

    a.age = 5;
    a.CompareTo(b); // -1
}

    由此可见,接口IComparable主要是实现类对象间的比较规则。

再看IComparer 这个接口提供一个需要两个参数的方法,这个参数也再做比较运算,但是比较主要是为了为对象做排序而非为给类增加比较运算。

class obj
{
    public int age = 10;
}

class objcomp : IComparer<obj>
{
    public int Compare(obj x, obj y)
    {
        //return x.age.CompareTo(y.age); 
        
//下面代码是此方法的具体实现 

        if (x.age == y.age)
        {
            return 0;
        }
        else if (x.age > y.age)
        {
            return 1;
        }
        else
        {
            return -1;
        }
    }
}

static void Main(string[] args)
{
    List<obj> list = new List<obj>();

    list.Add(new obj() { age = 50 });
    list.Add(new obj() { age = 20 });
    list.Add(new obj() { age = 40 });
    
    // 列表中元素原始顺序(按照age)50,20,40

    list.Sort(new objcomp()); // public void Sort(IComparer<T> comparer);调用了Sort方法的重载版本
    
    
// 经过排序列表中元素顺序(按照age)20,40,50
}

    当然了,如果你想更改排序规则按照降序排列可以交换 objcomp 中方法参数的 age 值大于和小于时的返回值。