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

所属分类: 软件编程 / C#教程 阅读数: 86
收藏 0 赞 0 分享
如下所示:
复制代码 代码如下:

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();
        }
    }
}
更多精彩内容其他人还在看

C# SendInput 模拟鼠标操作的实现方法

C# SendInput 模拟鼠标操作的实现方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中 paint()与Onpaint()的区别

paint是事件onpaint方法onpaint方法是调用paint事件的,用哪一个,效果是一样,就看那一个方便了内部是这样实现的:
收藏 0 赞 0 分享

c#中GetType()与Typeof()的区别

c#中GetType()与Typeof()的区别,需要的朋友可以参考一下
收藏 0 赞 0 分享

将字符串转换成System.Drawing.Color类型的方法

将字符串转换成System.Drawing.Color类型的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

C# 抓取网页内容的方法

C# 抓取网页内容的方法,需要的朋友可以参考一下
收藏 0 赞 0 分享

基于C#后台调用跨域MVC服务及带Cookie验证的实现

本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下
收藏 0 赞 0 分享

使用C#获取远程图片 Form用户名与密码Authorization认证的实现

本篇文章介绍了,使用C#获取远程图片 Form用户名与密码Authorization认证的实现。需要的朋友参考下
收藏 0 赞 0 分享

Winform跨线程操作的简单方法

线程间操作无效:从不是创建控件“label1”的线程访问它
收藏 0 赞 0 分享

C# WINFORM 强制让窗体获得焦点的方法代码

C# WINFORM 强制让窗体获得焦点的方法代码,需要的朋友可以参考一下
收藏 0 赞 0 分享

C#中方括号[]的语法及作用介绍

C#中方括号[]可用于数组,索引、属性,更重要的是用于外部DLL类库的引用。
收藏 0 赞 0 分享
查看更多