现在的位置: 首页 > 综合 > 正文

IComparable与IComparer接口在集合类中的用处

2012年01月25日 ⁄ 综合 ⁄ 共 2851字 ⁄ 字号 评论关闭

在简单的类型中,我们可以使用CompareTo,与Compare进行比较

例如:

在简单类型中使用

1 int intA = 4;
2  int intB =5;
3 int intResult = intA.CompareTo(intB);
4 Console.WriteLine(intResult);
5 intResult=System.Collections.Comparer.Default.Compare(a,b);
6 Console.WriteLine(intResult);

那么在我们的自定义类型中怎么做呢?

我们通过VS的对象管理器可以知道,我们的CompareTo方法与Compare方法都是IComparable接口和IComparer接口提供的。

如果我们自定义类中实现了这两个接口,那么也可以做这种操作!!!

实现IComparable接口的例子:

  

实现IComparable接口

1 class Student : IComparable
2 {
3 public int age;
4 public string name;
5 public Student()
6 {
7 }
8 public Student(string name, int age)
9 {
10 this.age = age;
11 this.name = name;
12 }
13 public int CompareTo(object obj)
14 {
15 if (obj is Student)
16 {
17 Student stu = (Student)obj;
18 return this.age - stu.age;
19 }
20 else
21 {
22 throw new Exception("类型不兼容!");
23 }
24 }
25 }
26 class Program
27 {
28 static void Main(string[] args)
29 {
30 Student stu = new Student("秦涛",23);
31 Student stu1 = new Student("王涛",35);
32 if (stu.CompareTo(stu1) > 0)
33 {
34 Console.WriteLine(stu.name + "年龄大于" + stu1.name + "的年龄");
35 }
36 else if (stu.CompareTo(stu1) == 0)
37 {
38 Console.WriteLine(stu.name + "年龄等于" + stu1.name + "的年龄");
39 }
40 else
41 {
42 Console.WriteLine(stu.name + "年龄小于" + stu1.name + "的年龄");
43 }
44 }
45 }

实现IComparer接口的例子:

实现IComparer接口

1 class StudentDefault:System.Collections.IComparer
2 {
3 public static StudentDefault Default = new StudentDefault();
4 public int Compare(object x, object y)
5 {
6 if (x is Student && y is Student)
7 {
8 Student s1 = (Student)x;
9 Student s2 = (Student)y;
10 return s1.age - s2.age;
11 }
12 else
13 {
14 throw new Exception("类型不兼容");
15 }
16 }
17
18 }
19 class Program
20 {
21 static void Main(string[] args)
22 {
23 Student stu = new Student("秦涛",23);
24 Student stu1 = new Student("王涛",35);
25 int intResult= StudentDefault.Default.Compare(stu, stu1);
26 if (intResult > 0)
27 {
28 Console.WriteLine(stu.name + "年龄大于" + stu1.name + "的年龄");
29 }
30 else if (intResult == 0)
31 {
32 Console.WriteLine(stu.name + "年龄等于" + stu1.name + "的年龄");
33 }
34 else
35 {
36 Console.WriteLine(stu.name + "年龄小于" + stu1.name + "的年龄");
37 }
38 }
39 }

有上面的例子可以得出结论如下:

   IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象
   IComparer在一个单独的类中实现,可以比较任意两个对象。

class Student : IComparable
{
public int age;
public string name;
public Student()
{
}
public Student(string name, int age)
{
this.age = age;
this.name = name;
}
public int CompareTo(object obj)
{
if (obj is Student)
{
Student stu
= (Student)obj;
return this.age - stu.age;
}
else
{
throw new Exception("类型不兼容!");
}
}
}
class StudentDefault:System.Collections.IComparer
{
public static StudentDefault Default = new StudentDefault();
public int Compare(object x, object y)
{
if (x is Student && y is Student)
{
Student s1
= (Student)x;
Student s2
= (Student)y;
return s1.age - s2.age;
}
else
{
throw new Exception("类型不兼容");
}
}

}
class Program
{
static void Main(string[] args)
{
Student stu
= new Student("秦涛",23);
Student stu1
= new Student("王涛",35);
Student stu2
= new Student("张军", 28);
ArrayList list
= new ArrayList();
list.Add(stu);
list.Add(stu1);
list.Add(stu2);
foreach (Student var in list)
{
Console.WriteLine(var.name
+ "年龄是" + var.age);
}
list.Sort();
foreach (Student var in list)
{
Console.WriteLine(var.name
+ "年龄是" + var.age);
}
list.Sort(StudentDefault.Default);
foreach (Student var in list)
{
Console.WriteLine(var.name
+ "年龄是" + var.age);
}
}
}

抱歉!评论已关闭.