C#泛型-IComparable接口使用

  系统提供了许多泛型类和泛型接口,List<T>和Dictionary<K,V>是常用的泛型类。 IComparable<T>是最常用的泛型接口。泛型接口具有一般接口的共同特点,即在接口中可以包含字段,属性,方法和索引器,但都不能实现。

IComparable和IComparer接口区别如下
◆IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象;
◆IComparer在一个单独的类中实现,可以比较任意两个对象。

  IComparable接口规定了一个没有实现的方法CompareTo(Object obj),语法如下:
+展开
-C#
public interface IComparable
{
int CompareTo(Object ojb);
}


  此接口的方法CompareTo用于比较对象大小,如果一个类实现了这个接口中的该方法,说明这个类的对象是可以比较大小的。

int CompareTo(Object obj)方法返回一个整型值,其含义下:
如果当前对象小于obj,则返回值小于0。
如果当前对象小于obj,则返回值大于0。
如果当前对象小于obj,则返回值等于0。

  IComparable接口接受的参数类型为Object,因此需要对CompareTo()函数的参数进行运行时类型校验。每一次执行比较时,都要重新解析参数的类型。

+展开
-C#
using System;
using System.Collections.Generic;
public class Student: IComparable
{
private string name;
public string Name
{
   get
   {
    return name;
   }
   set
   {
    name = value;
   }
}
private int age;
public int Age
{
   get
   {
    return age;
   }
   set
   {
    age = value;
   }
}
public Student(string sname, int sage)
{
   this.name = sname;
   this.age = sage;
}
//实现接口中的方法
public int CompareTo(object obj)
{
   //将参数转化为Student对象
   Student other = obj as Student;
   //比较大小,返回结果
   return this.age.CompareTo(other.age);
}
}

class Progarm
{
static void Main()
{
   Student stu1 = new Student("张三", 10);
   Student stu2= new Student("李四", 20);
   Student stu3 = new Student("王五", 30);
   //对象之间进行比较
   if (stu1.CompareTo(stu2) > 0)
    Console.WriteLine("{0}的年龄大于{1}", stu1.Name, stu2.Name);
   else
    Console.WriteLine("{0}的年龄小于{1}", stu1.Name, stu2.Name);
}
}


注意:参数obj必须与实现该接口的类有相同的类型,否则会引发异常。

+展开
-C#
Student other = obj as Student;


  使用as关键字将obj转换为实现接口的Student类的对象。

  说明:as属于运算符,用于在兼容的引用类型之间执行类型转换,类似于强制转换,只是强制转换失败时会引发异常,而as运算符将返回空值,不会引发异常。

  泛型接口IComparable<T>就是接口Icomparable的泛型版本,和前面的泛型一样,此泛型接口对类型有严格的约束,不需要类型转换。

IComparable<T>泛型接口仅包含一个方法,语法如下:

+展开
-C#
public interface Icomparable<T>
{
int CompareTo(T t)
}


  其中,“<T>”和List<T>中的T有相同的含义,代表任意类型,CompareTo方法中的参数t代表该数据类型的对象。

  把上面的代码改写一下:
+展开
-C#
public class Student: IComparable

换成
+展开
-C#
public class Student: IComparable<Student>


同时实现接口的代码改为:
+展开
-C#
//实现接口中的方法
public int CompareTo(Student other)
{
   //比较大小,返回结果
   return this.age.CompareTo(other.age);
}


其他代码不需要修改,运行结果和上面代码相同。

加支付宝好友偷能量挖...


评论(0)网络
阅读(216)喜欢(0)Asp.Net/C#/WCF