深入IComparable与IComparer的排序实例详解

如下所示:


代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace hgoApp
{
    class Comparer
    {
        static void Main()
        {
            Employee[] Employees = new Employee[5];

Employees[0] = new Employee("张三", 2800);
            Employees[1] = new Employee("李四", 1800);
            Employees[2] = new Employee("王五", 5800);
            Employees[3] = new Employee("马六", 12800);
            Employees[4] = new Employee("钱七", 8800);
            Console.WriteLine("按照姓名排序");
            Array.Sort(Employees);
            foreach (Employee em in Employees)
            {
                Console.WriteLine(em);
            }
            Console.WriteLine("按照薪水排序");
            Array.Sort(Employees, Employee.SalaryCom);
            foreach (Employee em in Employees)
            {
                Console.WriteLine(em);
            }
        }
    }
    class Employee : IComparable
    {
        private string _Name;
        public string Name
        {
            get { return _Name; }
        }
        private int _Salary;
        public int Salary
        {
            get { return _Salary; }
        }
        public Employee(string Name, int Salary)
        {
            _Name = Name;
            _Salary = Salary;
        }
        //显示接口实现
        int IComparable.CompareTo(object obj)
        {
            if (!(obj is Employee))
            {
                throw new ArgumentException("不是Employee类");
            }
            return _Name.CompareTo(((Employee)obj)._Name);
        }
        //提供一个公用的强类型重载版本
        public int CompareTo(Employee Em)
        {
            return _Name.CompareTo(Em._Name);
        }
        //当第一次实例化Employee的时候,_SalaryCom为空,当使用SalaryCom时,就会创建一个SalaryCompare对象,第2次,3次的时候,就可以直接使用_SalaryCom了
        private static SalaryCompare _SalaryCom = null;
        public static IComparer SalaryCom
        {
            get
            {
                if (_SalaryCom == null)
                {
                    _SalaryCom = new SalaryCompare();
                }
                return _SalaryCom;
            }
        }
        //嵌套类(这个类是针对薪水进行排序的类)
        private class SalaryCompare:IComparer
        {
            //使用指定的IComparer对Array中的元素进行排序
            int IComparer.Compare(object obj1,object obj2)
            {
                if (!(obj1 is Employee) || !(obj2 is Employee))
                {
                    throw new ArgumentException("不是Employee类");
                }
                return ((Employee)obj1)._Salary.CompareTo(((Employee)obj2)._Salary);
            }
        }
        public override string ToString()
        {
            return _Name +"  "+ _Salary.ToString();
        }
    }
}

(0)

相关推荐

  • c#集合快速排序类实现代码分享

    说明: 1.集合类型参数化: 2.可根据集合中的对象的各个属性进行排序,传入属性名称即可: 注:属性必须实现了IComparable接口,C#中int.datetime.string等基本类型都已经实现了IComparable接口. 复制代码 代码如下: /// <summary>    /// 对集合进行排序,如    /// List<User> users=new List<User>(){.......}    /// ListSorter.SortList&l

  • C#通过IComparable实现ListT.sort()排序

    本文实例讲述了C#通过IComparable实现ListT.sort()排序的方法,分享给大家供大家参考之用.具体方法如下: 通常来说,List<T>.sort()可以实现对T的排序,比如List<int>.sort()执行后集合会按照int从小到大排序.如果T是一个自定义的Object,可是我们想按照自己的方式来排序,那该怎么办呢,其实可以用过IComparable接口重写CompareTo方法来实现.流程如下: 一.第一步我们申明一个类Person但是要继承IComparabl

  • C#中DataTable排序、检索、合并等操作实例

    一.排序1.获取DataTable的默认视图2.对视图设置排序表达式3.用排序后的视图导出的新DataTable替换就DataTable(Asc升序可省略,多列排序用","隔开)1).重生法 复制代码 代码如下: dstaset.Tables.Add(dt)dataset.Tables(0).DefaultView.Sort = "id desc" 2).直接法 复制代码 代码如下: dv = New DataView(dt)dv.Sort = "id d

  • C#对DataTable里数据排序的方法

    直接给个实例代码吧 复制代码 代码如下: protected void Page_Load(object sender, EventArgs e)    {        DataTable dt = new DataTable();        dt.Columns.Add("Name");        dt.Columns.Add("Age");//因为是字符串,所以排序不对        dt.Rows.Add("小明", "

  • c# 实现IComparable、IComparer接口、Comparer类的详解

    在默认情况下,对象的Equals(object o)方法(基类Object提供),是比较两个对象变量是否引用同一对象.我们要必须我自己的对象,必须自己定义对象比较方式.IComparable和ICompare 接口是.net framework 中比较对象的标准方式,这两个接口之间的区别如下:1. IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象.2.IComparer 在一个单独的类中实现,可以比较任意两个对象.一般情况下,我们使用 IComparable 给出类的

  • C# 键值对数据排序代码

    复制代码 代码如下: public static void SortDicWithLinq(){            Dictionary<DateTime, String> dd = new Dictionary<DateTime, String>();            DateTime dt = DateTime.Now;            dd.Add(dt, "bbb");            dd.Add(dt.AddDays(-1),&

  • c#基数排序Radix sort的实现方法

    经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是需要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数 例如 待排序数组[62,14,59,88,16]简单点五个数字 分配10个桶,桶编号为0-9,以个位数数字为桶编号依次入桶,变成下边这样 |  0  |  0  | 62 |  0  | 14 |  0  | 16 |  0  |  88 | 59 | |  0  |  1  |  2  |  3  |  4 | 

  • C#基础之数组排序、对象大小比较实现代码

    从个小例子开始: 复制代码 代码如下: int[] intArray = new int[]{2,3,6,1,4,5}; Array.Sort(intArray); Array.ForEach<int>(intArray,(i)=>Console.WriteLine(i)); 这个例子定义了一个int数组,然后使用Array.Sort(arr)静态方法对此数组进行排序,最后输出排序后的数组.以上例子将毫无意外的依次输出1,2,3,4,5,6. 为什么Array的Sort方法可以正确的对i

  • C#实现Datatable排序的方法

    本文实例展示了C#实现Datatable排序的方法,分享给大家供大家参考之用.具体方法如下: 一般来说,在C#中要对Datatable排序,可使用DefaultView的Sort方法.需要先获取Datatable的DefaultView,然后设置得到的Dataview的sort属性,最后用视图的ToTable方法将排好序的dataview导出为Datatable. 代码如下: DataTable dt = new DataTable(); dt.Columns.Add("ID", ty

  • C#归并排序的实现方法(递归,非递归,自然归并)

    //Main: 复制代码 代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Merge{    class Program    {        static void Main(string[] args)        {            while (true)            {                Console.W

  • c#对list排序示例

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ListSort { class Program { static void Main(string[] args) { List listCustomer = new List(); listCustomer.Add(new Customer { name = "客户1",

随机推荐