问一个关于比较的问题
PersonComparerName.cs程序代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Ch11020204 { class PersonComparerName:IComparer { public static IComparer Default = new PersonComparerName(); public int Compare(object x, object y) { if (x is Person && y is Person) { return Comparer.(((Person)x).Name, ((Person)y).Name); } else { throw new ArgumentException("One or both object to compare are not person objects."); } } } }
Person.cs
程序代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace Ch11020204 { class Person:IComparable { public string Name; public int Age; public Person(string name, int age) { Name = name; Age = age; } public int CompareTo(object obj) { if (obj is Person) { Person otherPerson = obj as Person; //据我的理解obj,就是this,obj和Person都是引用类型,那么otherPerson的值被浅拷贝到otherPerson中,otherPerson的值和this的值应该是一样的. 但事实并不是这样,弄不明白为什么 Debug.WriteLine("this.age:{0} , other.age:{1}", this.Age, otherPerson.Age); return this.Age - otherPerson.Age; } else { throw new ArgumentException("Object to compare to is not a person object."); } } } }
Program.cs
程序代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace Ch11020204 { class Program { static void Main(string[] args) { ArrayList list = new ArrayList(); list.Add(new Person("Jim", 30)); list.Add(new Person("Bob", 25)); list.Add(new Person("Bert", 27)); list.Add(new Person("Ernie", 22)); Console.WriteLine("Unsorted people:"); for (int i = 0; i < list.Count; i++) { Console.WriteLine("{0} ({1})", (list[i] as Person).Name, (list[i] as Person).Age); } Console.WriteLine(); Console.WriteLine("People sorted with default comparer (by age):"); list.Sort(); for (int i = 0; i < list.Count; i++) { Console.WriteLine("{0} ({1})", (list[i] as Person).Name, (list[i] as Person).Age); } Console.WriteLine(); Console.WriteLine("People sorted with nondefault comparer (by name):"); list.Sort(PersonComparerName.Default); for (int i = 0; i < list.Count; i++) { Console.WriteLine("{0} ({1})", (list[i] as Person).Name, (list[i] as Person).Age); } Console.ReadKey(); } } }