zoukankan      html  css  js  c++  java
  • C#_IComparer实例

    调用LIST的Sort的时候会调用IComparer的默认实现,quicksort会调用每个元素的CompareTo的IComparable实现


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ComparerTest
    {
        class Employee : IComparable<Employee>
        {
            private int empID;
            private int yearOfSvc = 1;
    
            public Employee(int empID)
            {
                this.empID = empID;
            }
    
            public Employee(int empID, int yearOfSvc)
            {
                this.empID = empID;
                this.yearOfSvc = yearOfSvc;
            }
    
            public override string ToString()
            {
                return "ID: " + empID.ToString()
                    + "  yearOfSvc: " + yearOfSvc.ToString();
            }
    
            public bool Equals(Employee other)
            {
                if (this.empID == other.empID)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            //获取Comparer对象的静态方法
            public static EmployeeComparer GetComparer()
            {
                return new Employee.EmployeeComparer();
            }
            //比较委托回Employee
            //Employee使用整形的默认
            //CompareTo方法
            public int CompareTo(Employee rhs)
            {
                return this.empID.CompareTo(rhs.empID);
            }
    
    
            //自定义Comparer要调用的特殊表现
            public int CompareTo(Employee rhs,
                Employee.EmployeeComparer.ComparisonType whichComparision)
            {
                switch (whichComparision)
                { 
                    case Employee.EmployeeComparer.ComparisonType.EmpID:
                        return this.empID.CompareTo(rhs.empID);
                    case Employee.EmployeeComparer.ComparisonType.Yrs:
                        return this.yearOfSvc.CompareTo(rhs.yearOfSvc);
                }
                return 0;
            }
    
            //实现IComparer的内嵌类
            public class EmployeeComparer : IComparer<Employee>
            {
                private Employee.EmployeeComparer.ComparisonType whichComparision;
    
                public enum ComparisonType
                {
                    EmpID,
                    Yrs
                };
    
                public bool Equals(Employee lhs, Employee rhs)
                {
                    return this.Compare(lhs, rhs) == 0;
                }
                //让Empolyee对象自己比较
                public int Compare(Employee lhs, Employee rhs)
                {
                    return lhs.CompareTo(rhs, WhichComparison);
                }
    
                public int GetHashCode(Employee e)
                {
                    return e.GetHashCode();
                }
    
                public Employee.EmployeeComparer.ComparisonType WhichComparison
                {
                    set
                    {
                        whichComparision = value;
                    }
                    get 
                    {
                        return whichComparision;
                    }
    
                }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                List<Employee> empArray = new List<Employee>();
    
                Random ra = new Random();
    
                for (int i = 0; i < 5; i++)
                {
                    empArray.Add(new Employee(ra.Next(10)+100,ra.Next(20)));
                }
    
                for (int i = 0; i < empArray.Count; i++)
                {
                    Console.Write("
    {0}",empArray[i].ToString());
                }
                Console.WriteLine();
                Console.WriteLine();
                Employee.EmployeeComparer c =  Employee.GetComparer();
    
                c.WhichComparison = Employee.EmployeeComparer.ComparisonType.EmpID;
    
                empArray.Sort(c);
    
                for (int i = 0; i < empArray.Count; i++)
                {
                    Console.Write("
    {0}", empArray[i].ToString());
                }
                Console.WriteLine();
                Console.WriteLine();
                Employee.EmployeeComparer c2 = Employee.GetComparer();
    
                c.WhichComparison = Employee.EmployeeComparer.ComparisonType.Yrs;
    
                empArray.Sort(c2);
    
                for (int i = 0; i < empArray.Count; i++)
                {
                    Console.Write("
    {0}", empArray[i].ToString());
                }
                Console.ReadLine();
            }
        }
    }
    


  • 相关阅读:
    网络测量中基于Sketch方法的简单介绍
    Reading SBAR SDN flow-Based monitoring and Application Recognition
    Reading Meticulous Measurement of Control Packets in SDN
    Reading SketchVisor Robust Network Measurement for Sofeware Packet Processing
    ovs加dpdk在日志中查看更多运行细节的方法
    后缀数组
    (转载)LCA问题的Tarjan算法
    Codeforces Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) A. Checking the Calendar(水题)
    Vijos 1816统计数字(计数排序)
    卡特兰数
  • 原文地址:https://www.cnblogs.com/MarchThree/p/3720473.html
Copyright © 2011-2022 走看看