博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集合的枚举和排序
阅读量:6434 次
发布时间:2019-06-23

本文共 2998 字,大约阅读时间需要 9 分钟。

实现了IEnumerable接口才能遍历

先来看看IEnumerable接口的定义:

public interface IEnumerable{      IEnumerator GetEnumerator();  }

这个接口非常简单,主要就是一个方法GetEnumerator,用来返回一个IEnumerator对象。继续深入下去,IEnumerator接口的定义如下:

public interface IEnumerator{    bool    MoveNext();    void    Reset();    object Current{
get;}}

上面的IEnumerator接口定义的属性和方法,只有一个目的,就是实现如何遍历。下面具体解释一下:

  • Current属性:用来返回当前集合项的值
  • MoveNext方法:移动到集合对象的下一项,如果有下一项,就返回true。如果没有,就返回false。
  • Reset方法:重置然后可以重头访问集合

当用foreach循环来访问一个对象的时候,其实是默认的调用了对象里面的GetEnumerator()方法。而该方法就是由IEumerable接口给暴露出来的,所以如果想自定义一个能实现枚举功能的集合类就要先实现一个IEnumerable接口,然后实现里面的GetEnumerator方法。如下所示:

namespace Test {      class Program     {          static  void Main( string[] args)         {             Garage car =  new Garage();              foreach(Car c  in car)             {                 Console.WriteLine( " {0} is going {1} MPH ", c.Name, c.Age);             }             Console.ReadKey();         }     }      public  class Garage:IEnumerable      {                 Car[] carArray =  new Car[ 4];            // 在Garage中定义一个Car类型的数组carArray,其实carArray在这里的本质是一个数组字段                 // 启动时填充一些Car对象                  public Garage()                 {                          // 为数组字段赋值                         carArray[ 0] =  new Car( " Rusty ",  30);                         carArray[ 1] =  new Car( " Clunker ",  50);                         carArray[ 2] =  new Car( " Zippy ",  30);                         carArray[ 3] =  new Car( " Fred ",  45);                 }          public IEnumerator GetEnumerator()         {               return  this.carArray.GetEnumerator();         }     }      public  class Car     {          public  string Name {  get;  set; }          public  int Age {  get;  set; }          public Car( string name, int age)         {             Name = name;             Age = age;         }     } }

Sort()方法以及IComparable、IComparer接口

下面举一个例子,这里我们自定义了一个类Car,然后对Car的集合进行排序。

 

public class Car{     public string Name{
get;set;} public int Year{
get;set;} public int Seats{
get;set;} }

 

假如我们直接调用Sort方法,就好悲剧抛出InvalidOpeartionException异常

IComparable接口

IComparable接口提供了比较某个特定类型对象的方法。这里来说,我们要让Car实现IComparable接口来达到比较Car对象的目的,从而实现排序。实现IComparable接口,就必须实现CompareTo方法,具体如下:

 

public class Car: IComparable{       public string Name { get; set; }       public int Year { get; set; }       public int Seats { get; set; }       public int CompareTo(object obj)       {           var car = (Car) obj;           return String.CompareOrdinal(Name, car.Name);       }}

 

上面我们的Car对象实现了IComparable接口,按照Name字符串属性来比较。直接运行Sort()方法,就能够得到排序结果:

IComparer接口

IComparer接口可以提供更加丰富和灵活的排序功能,它的实现是一个比较器。比如,你可能需要在不同的场合,根据不同的属性来排序。下面就来实现一个根据Car的Year属性来排序。

 

public class CarYearComparer: IComparer
{ public int Compare(Car x, Car y) { if (x.Year > y.Year) return 1; if (x.Year < y.Year) return -1; return 0; }}

 

在调用Sort方法的时候,需要指定使用的IComparer实现:

cars.Sort(new CarYearComparer());

得到的排序结果和上面的根据Name属性不同:

 

转载地址:http://jtqga.baihongyu.com/

你可能感兴趣的文章
阿里云上Kubernetes集群联邦
查看>>
洛谷2219:[HAOI2007]修筑绿化带——题解
查看>>
监控webservice信息
查看>>
a标签中href=""的几种用法(转)
查看>>
python
查看>>
ubuntu 常用生产环境部署配置测试调优
查看>>
【JS】//将中文逗号转换为英文逗号
查看>>
在VS2012中实现Ext JS的智能提示太简单了
查看>>
Extnet Direct 提交后台事件文件下载设置
查看>>
邻接矩阵与二叉排序树
查看>>
CSS选择器
查看>>
购物车练习
查看>>
js实现在表格中删除和添加一行
查看>>
SOCKET简单爬虫实现代码和使用方法
查看>>
跨域解决方案汇总
查看>>
In App Purchase
查看>>
js判断对象的类型的四种方式
查看>>
RPC框架的可靠性设计
查看>>
使用自选择创建团队
查看>>
基准测试(Benchmarks)不必消亡
查看>>