在.net framework中,数组和集合都实现了用于排序的方法sort(),数组通过调用Array.Sort(数组名)排序,集合通过调用 集合对象.Sort()方法排序。

默认的排序是使用升序排列,并且只能针对基本的数值类型排序,因为数值类型默认实现了对两个值比较的接口。但如果是引用类型需要排序,则此引用类型

需要实现IComparable接口,实现接口中的CompareTo()方法用于比较两个对象。

与比较和排序有关的接口有四个:非范型版本IComparable和IComparer,范型版本IComparable和IComparer

IComparable接口的主要目的是在需要比较和排序的类中实现CompareTo()方法,用于定义此类的2个对象比较的时候的默认的比较规则。

IComparer接口的主要目的是使某个继承此接口的类实现Comapre()方法,在此方法中定义两个对象的比较规则。此类就可以作为Sort()函数的参数,用于

在排序的时候作为比较和排序的规则。

例如:如果我们有一个学生类Student,有4个字段:int ID;Name;Score;如果有一个学生数组或学生集合,此集合需要排序。

则我们要做的工作为:

1.使Student能被比较和排序,就要实现IComparable接口,在CompareTo()方法中定义默认的排序规则,例如升序。

2.如果要实现降序,则我们需要定义一个类,此类实现IComparer接口,在Compare()中定义另外一种比较和排序的规则,例如降序。

3.调用Sort()方法实现排序,此方法可以不带参数,按默认规则排序,也可以把实现了IComparer的接口的类的对象作为参数,这样排序时将按照

另外一种规则排序。

下面示例演示了按升序或降序对一个Student类的数组或集合进行了排序:

using System;

using System.Collections;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ConsoleApplication1

{

//同时实现了范型和非范型的IComparable

public class Student:IComparable,IComparable

{

public int ID;

public string Name;

public int Score;

public Student(int id, string name, int score)

{

this.ID = id;

this.Name = name;

this.Score = score;

}

public string Info()

{

return string.Format("学号:{0,-5}姓名:{1,-5}分数:{2}",ID,Name,Score);

}

int IComparable.CompareTo(object obj)

{

return this.Score.CompareTo((obj as Student).Score);

}

int IComparable.CompareTo(Student other)

{

return this.Score.CompareTo(other.Score);

}

}

//实现了非范型的IComparer接口

public class ReverseCompareClass : IComparer

{

int IComparer.Compare(object x, object y)

{

return ((new CaseInsensitiveComparer()).Compare(y, x));

}

}

//实现了范型的IComparer接口

public class StuReverseCompareClass : IComparer

{

int IComparer.Compare(Student x, Student y)

{

return y.Score.CompareTo(x.Score);

}

}

class Program

{

static void Main(string[] args)

{

ArrayList stu = new ArrayList();

//List stu = new List();

int i;

Random r = new Random();

for (i = 0; i < 10; i++)

{

stu.Add( new Student(i,i.ToString(),r.Next(60,90)));

}

//如果使用非范型集合,我们就在sort()中使用非范型的比较类

stu.Sort(new ReverseCompareClass());

//如果使用范型集合,我们就在sort()中使用范型的比较类

//stu.Sort(new StuReverseCompareClass());

for (i = 0; i < 10; i++)

{

Console.WriteLine((stu[i] as Student).Info());

//Console.WriteLine(stu[i].Info());

}

Console.Read();

}

}

}

使用范型的好处是:类型安全,效率高,因为不存在装箱和拆箱操作。

c#sort升序还是降序_C#中对数组或集合进行升序或降序排序相关推荐

  1. scala中打印数组和集合_如何在Scala中打印数组?

    scala中打印数组和集合 Scala中的数组 (Array in Scala) In Scala, Array is a data structure that is a collection of ...

  2. xml中遍历数组或集合

    xml中遍历数组或集合 数组.集合都可以(数组中数据格式可以是字符串/int)

  3. c#中如何删除数组中的元素_C中的数组

    c#中如何删除数组中的元素 为什么我们需要数组? (Why do we need Arrays?) Consider the problem of storing 10 integers. The n ...

  4. JAVA-List排序-Collections.sort()-对象数组(集合)根据某一属性排序

    JAVA-List排序-Collections.sort() 当我们想对一个对象数组(集合)根据某一属性进行排序时,我们可以使用list中的Collection.sort(),这是一种较快捷的方式. ...

  5. 笔试算法题(28):删除乱序链表中的重复项 找出已经排好序的两个数组中的相同项...

    出题:给定一个乱序链表,节点值为ASCII字符,但是其中有重复项,要求去除重复项并保证不改变剩余项的原有顺序: 分析:创建一个256(2^8)大小的bool数组,初始化为false,顺序读取链表,将字 ...

  6. 谈谈JavaScript中的数组、集合及效率

    数组是JavaScript提供的一个内部对象,它是一个标准的集合,我们可以添加(push).删除(shift)里面元素,我们还可以通过for循环遍历里面的元素,那么除了数组我们在JavaScript里 ...

  7. c#sort升序还是降序_c# List的sort排序方法详解

    诸如List&ltT&gt等泛型集合类,直接提供了sort()方法用于将集合中的元素进行排序. 但是,其前提是集合中存放的是可直接排序的基本类型,如List&ltint& ...

  8. 数组:合并同为升序或者降序的数组

    数组合并是归并排序中的一个步骤,今单独就两个有序数组的合并给出代码实现.归并排序的另一个步骤就是递归,递归就是一个方法在其方法体的某个地方调用自己,这样就会将同一个逻辑不断的压栈,到达递归条件后,又一 ...

  9. 在已经排好序的线性表中插入一个数,还是升序

    在已经排好序的线性表中插入一个数,还是升序 #include<stdio.h> #define Maxsize 100 typedef struct s {int elem[Maxsize ...

最新文章

  1. Facebook 分享 MySQL 5.6 到 8.0 的迁移经验
  2. 消息幂等(去重)通用解决方案,RocketMQ
  3. ASP.NET中密码保护,MD5和SHA1算法的使用
  4. 带你掌握java反序列化漏洞及其检测
  5. Golang Java 实现 【将有序数组装换为二叉搜索树】
  6. 一些基本的数学概念,LDA的表述
  7. 【mybatisPlus】mybatis基本使用
  8. 稀疏表示、压缩感知.
  9. BNS100数码人像采集系统产品说明书
  10. UrlRewrite的使用
  11. ENSP实验五——三层交换机+二层交换机
  12. 重庆ETC学员“食神大赛”
  13. Flash:形变动画的制作
  14. java espresso车架,只爱钢架公路:Casati Espresso
  15. Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation论文解析(视频超分)
  16. 保时捷Taycan的800V电气架构赏析
  17. Linux UART编程 驱动蓝牙芯片
  18. VMware虚拟机如何开启雷电模拟器的VT?
  19. python人民币转大写_python2.x实现人民币转大写人民币
  20. centos6——初始化脚本

热门文章

  1. 跟郎朗媳妇有得一拼的AI,只看弹琴动作,完美复现原声 | CVPR 2020
  2. 完美解释了递归,哈哈哈哈
  3. 深度学习先驱Bengio:AI顶会论文的Deadline是时候取消了
  4. 引进研究生:​50万房补+年薪13万起;本科生30万房补​
  5. 这是一名南京985AI硕士,CSDN博客专家
  6. 10种Git技巧,让你省时省力又省心!
  7. 这道算法题太简单?你忽略了时间复杂度的要求!
  8. 和为s的连续正数序列
  9. python爬虫,生成文件速度追不上已经爬取文件的生成速度。
  10. python 正则表达式re常用操作符 使用方法 怎么用re正则表达式表示一个IP地址:0-255