对象的比较与排序:IComparable和IComparer接口

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 值大于和小于时的返回值。
时间: 2024-08-05 15:07:41

对象的比较与排序:IComparable和IComparer接口的相关文章

比较和排序 IComparable And IComparer

1.List<Student>默认排序 为类创建默认排序实现IComparable,此代码的实现为年龄升序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IComparable_And_IComparer.Model { /// <summary> /// 学生类 /// <

IComparable和IComparer接口

C#中,自定义类型,支持比较和排序,需要实现IComparable接口.IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表示当前对象大于被比较对象,0表示两者相等,-1表示当前对象小于被比较对象. public int CompareTo(object o) {} 若想以更加灵活的方式对自定义类进行比较,可以声明一个继承自IComparer接口的比较器,实现接口方法Comprae(),接收2个object类型参数作为比

IComparable和IComparer接口的简析

默认情况下,对象的Equals(object o)方法是比较两个对象是否引用同一个对象.如果我们有自己的对象,就要自己定义对象比较方式: 1.IComparable在要比较的对象(类的实例化就是对象)类中实现,可以比较该对象和另一个对象. 2.IComparer在一个单独的类中实现,可以任意比较两个对象. 通俗的讲,IComparable是能够比较,具备比较的能力.比如说某个人具备编程的能力,如果需要对编程能力的高低进行比较的话,就必须在自己的类中去实现怎么具体的方法.IComparer是比较者

实现IComparable、IComparer接口

using System;using System.Collections.Generic; public class MyClass{ public class Employee:IComparable<Employee> { public int EmpID; public string YearsOfSvc = "1"; public Employee(int id) { EmpID = id; } public Employee(int id , string ys

c# IComparable与IComparer接口

原文地址:https://www.cnblogs.com/fanweisheng/p/11517698.html

比较和排序(IComparable和IComparer以及它们的泛型实现)

本文摘要: 1:比较和排序的概念: 2:IComparable和IComparer: 3:IComparable和IComparer的泛型实现IComparable<T>和IComparer<T>: 1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如string提供了按字母进行比较,int提供了按整数大小进行比较. 2:ICompara

比较和排序:IComparable和IComparer

创建实体类,如Person,默认按照年龄进行排序,则需要为实体类实现IComparable接口. class Person : IComparable { public string Name { get; set; } public int Age { get; set; } public override string ToString() { return string.Format("Name : {0} ; Age : {1} .", this.Name, this.Age)

C# IComparable接口、IComparer接口和CompareTo(Object x)方法、Compare()方法

在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异.比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?重新实现IComparer接口不失为一个好办法. IComparable.CompareTo 方法 在MSDN上是这么解释(机器翻译过来)的: IComparable接口:定义一种特定于类型的通用比较方法,值类型或类通过实现此方法对其实例进行排序. IComparer接口:公开一种比较两个对象的方法. 详细理解就是: 在默认情况

C# 用实例来理解IComparable和IComparer

通过Array的Sort方法来理解的 Sort方法要 通过对象去继承IComparable接口来实现排序(当然也有其它办法),我想入门这可能就是对这句话有点不理解,在下面会有注释 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections; namespace ConsoleApplication1{ /// <summary> /// 设置