解析.Net编程接口剖析系列之比较和排序(3)_.Net教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:揭秘.net基础知识错误注意二十二点知识
1:command调用存储过程的时候,如果输出是dataset,selectcommand的command对象的connection先要指出,否则catch一辈子也是空的.. 2:存储过程的varchar字段如果是x.x的这种格式,容易出现细

光说太抽象,我们下面还是继续上一节对学生进行排序的问题进行讨论。这里我们可以创建一个专门的学生比较类StudentComparer, 而它则实现了IComparer的泛型接口System.Collections.Generic.IComparer<Student>,StudentComparer的作用是根据成绩对学生进行比较。为了将IComparer的优越性体现出来,我们这里在StudentComparer的构造函数中增加了两个参数subject和reverse,前者用于指定我们要按照何种科目成绩进行比较,而后者则指定是否将结果取反(当然我们也可以使用Array.Reverse方法来将结果按照降序排列,这里只是实现方法之一)。好,这样我们比较器就这样设计好了,看看下面的代码:

以下为引用的内容: public class StudentComparer: System.Collections.Generic.IComparer<Student>
{
SubjectEnum _subject;
bool _reverse;
  
public StudentComparer(SubjectEnum subject, bool reverse)
{
_subject = subject;
_reverse = reverse;
}
  
#region IComparer<Student> Members
  
public int Compare(Student left, Student right)
{
if (left == null && right == null)
return 0;
else if (left == null)
return -1;
else if (right == null)
return 1;
  
//比较响应科目的成绩
int result = left.Scores[_subject].CompareTo(right.Scores[_subject]);
  
//如果反序,只要将结果取反即可
if (_reverse) result = -result;
return result;
}
 
#endregion
}

一个功能强大的比较器就这样实现了,那么接下来我们就来实现将学生按照总分进行从高到底的排序,这里我们只需要对main函数进行稍微的修改就可以了,使用Array.Sort的另外一个重载方法Array.Sort (T[], Generic IComparer) 来进行比较。

看到上面我们在StudentComparer的构造函数中传入了Total(总分)和True(降序),我们看看执行结果:

Name Total Chinese English Math
Alex  268    88  85  95
Rose  248 92 91 65
Jack  245 90 80 75
Michale 240 80      90 70

太棒了,IComparer是这样的神奇,想象一下如果没有IComparer而仅仅要用IComparable来实现上面的功能,将是多么麻烦的事情,更加重要的是,那会将Student类的代码变的一团糟,就如同一个上班族却天天要想着回家给自己种的蔬菜浇浇水,给自己养的猪喂喂食一样,这些琐碎的东西会让你的生活一团糟的。

分享:Windows CE.Net下矩阵键盘开发设计详解
引言 随着现代科技日新月异的发展,作为新兴产业的嵌入式移动信息设备的应用越来越广。这些嵌入式设备中的PDA以其体积小、重量轻、便于携带、功能强大、功耗低等特点而备受青睐。键盘作

来源:模板无忧//所属分类:.Net教程/更新时间:2009-09-05
相关.Net教程