问一个关于比较的问题
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();
}
}
}







