|
|
2#

楼主 |
发表于 2008-11-14 17:42:31
|
只看该作者

public enum SubjectEnum
{
Total =0,
Chinese,
English,
Math,
}
public class Scores //分数类,用于存储分数
{
int[] _score = new int[4];
public int this[SubjectEnum score]
{
get { return _score[(int)score]; }
set { _score[(int)score] = value; }
}
public override string ToString()
{
string str = "";
foreach (int score in _score)
{
str += " " + score.ToString();
}
return str;
}
}
public class Student:IComparable //学生类
{
string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
Scores _scores=new Scores();
public Scores Scores
{
get { return _scores; }
set { _scores = value; }
}
public Student(string name,int chinese, int english, int math)
{
_name = name;
_scores[SubjectEnum.Chinese] = chinese;
_scores[SubjectEnum.English] = english;
_scores[SubjectEnum.Math] = math;
_scores[SubjectEnum.Total] = chinese +english +math;
}
public override string ToString()
{
return _name + _scores.ToString();
}
#region IComparable Members
public int CompareTo(object obj)
{
if (!(obj is Student))
throw new ArgumentException("Argument not a Student", "obj");
return Name.CompareTo(((Student)obj).Name);
}
#endregion
}
来看看我们的Main函数,我们在一个数组中存储了若干个学生,并且利用了Array.Sort对起进行了排序。
static void Main(string[] args)
{
Student[] students = new Student[4];
students[0] = new Student("Michale", 80, 90, 70);
students[1] = new Student("Jack", 90, 80, 75);
students[2] = new Student("Alex", 88, 85, 95);
students[3] = new Student("Rose", 92, 91, 65);
Array.Sort(students);
Console.WriteLine("Name Total Chinese English Math");
foreach (Student student in students)
{
Console.WriteLine(student);
}
Console.ReadKey();
}
下面来看看输出结果:
Name Total Chinese English Math
Alex 268 88 85 95
Jack 245 90 80 75
Michale 240 80 90 70
Rose 248 92 91 65
可以发现,学生们被很好的按照名称字母的顺序进行了排序,并且从小到大地打印出来了。但是我们这里还是要留下一个问题,假如我们有时候需要按照某项成绩进行排序又如何实现呢?假如我们排序的时候希望按照降序进行排列又该如何呢?呵呵,聪明的读者可能已经想到了,这正是我下一节想要说的内容。
以下为引用的内容: System.Collections.IComparer & System.Collections.Generic. IComparer<T>
IComparer是这么样的一个接口,它是用于实现一个专门的“比较器”,这个比较器可以对传入的两个对象比较大小。我们来看看它的定义:
以下为引用的内容: [ComVisible(true)]
public interface IComparer
{
int Compare(object x, object y);
}
大家可能会对IComparer存在的必要性有点疑问,那就是既然我们有了IComparable就能够实现对象的比较以及排序,那么还需要IComparer做什么呢,岂不是画蛇添足?我的回答是:不,IComparer的存在很有必要,因为它可以用来实现一些专门的和功能更加强大的比较器。就如现代社会的分工一样,以前落后的小农经济一去不复返了,社会上的各成员要进行相互协作才能发挥最高的效率;同样,我们设立专业的IComparer,使得比较的功能得以扩展和专业化,你有了更多的选择。将对象进行比较的时候,你可以使用不同的IComparer来使用不同的方法来比较,就像我们购买商品选择不同的品牌一样(试想这件东西不是购买的而是你自己生产的话,那么你就失去了选择的机会了)。另外专门的IComparer也可以提供一些属性,来让我们的比较变得更加灵活。 |
|