c#中实现对象实例的比较有两个常用接口即Icomparer和Icomparable,今天对其进行整理。
1.首先解释一下comparer和comparable两个单词的意思,这对两个接口的理解有所帮助。
comparable:是可比较,那么实现Icomparable接口自然是说这个类的实例是可以比较的。
comparer:英文中没有这个词,但从字面可以理解它是比较器的意思,那么实现Icomparer接口自然是说这个类是起到一个比较器的作用。
2.c#中实现对象集合的排序可以使用ArrayList中的Sort()方法,而有比较才能谈排序,因为不是基本类型(如string ,int.double......等)所以.NET Framework不可能一一制定他们的比较规则,那么则需要程序员自行制定,而比较规则的制定就需要通过继承这两个接口之一来实现。制定了比较规则后则才可以用以下两种方式之一调用排序:
(1)ArrayList实例.Sort();
(2)ArrayList实例.Sort(实现Icomparer接口的类);
3.通过完整示例来演示两个接口的用法:
(2)在main函数中添加Person类的对象集合People,并创建4个person类,将其一一加入People集合中
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //新建集合people用来存放person实例 ArrayList people = new ArrayList(); //建立4个person实例 Person person1 = new Person("Jone", 18); Person person2 = new Person("Tom", 20); Person person3 = new Person("Lily", 15); Person person4 = new Person("July", 25); //将实例添加到people集合中 people.Add(person1); people.Add(person2); people.Add(person3); people.Add(person4); //输出原来序列 Console.WriteLine("原来序列:"); foreach (Person person in people) { Console.WriteLine("person name: {0} age:{1}", person.Name, person.Age); } //用实现Icomparable进行排序 people.Sort(); //用实现Icomparable的方法输出排序后的序列 Console.WriteLine("排序后的序列:"); foreach (Person person in people) { Console.WriteLine("person name: {0} age:{1}", person.Name, person.Age); } //用实现Icomparer的方法进行排序 people.Sort(PersonComparer.Default); //用实现Icomparer的方法输出排序后的序列 Console.WriteLine("排序后的序列:"); foreach (Person person in people) { Console.WriteLine("person name: {0} age:{1}", person.Name, person.Age); } Console.ReadKey(); } } public class Person:IComparable { /// <summary> /// 两个私有字段: /// 人物姓名; /// 人物年龄; /// </summary> private string name; private int age; /// <summary> /// 构造函数 /// </summary> public Person(string myname,int myage) { name = myname; age = myage; } /// <summary> /// 两个共有属性: /// 分别对应两个私有字段; /// </summary> public string Name { set { name = value; } get { return name; } } public int Age { set { age = value; } get { return age; } } public int CompareTo(object myobject) { if (myobject is Person)//用is运算符判断要比较的对象是否是Person对象 { //如果是用as运算符进行对象转换,返回年龄比较结果(一个整数,表示两者差) Person myperson = myobject as Person; return this.Age - myperson.Age; //return myperson.Age - this.Age; } else { //如果不是,抛出异常 throw new ArgumentException("Object to compare to is not a Person Object"); } } } public class PersonComparer : IComparer { //静态字段,方便使用,没有也可,调用方法会变 public static IComparer Default = new PersonComparer(); public int Compare(object myperson1, object myperson2) { //用is运算符判断要比较的对象是否都是Person对象 if (myperson1 is Person && myperson2 is Person) { //如果是,调用.Net Framework已经实现好的能比较基本类型的函数:Comparer.Default.Compare //(要用using System.Collections;) return Comparer.Default.Compare((Person)myperson1, (Person)myperson2); } else { //如果不是抛出异常 throw new ArgumentException("One or both objects to compare are not Person objects."); } } } }