IComparable与IComparer
2015-12-30 14:05
483 查看
1.当我们要对集合进行排序时,集合中的元素必须要是一类元素,且元素的类型实现了IComparable接口
ArrayList arr = new ArrayList() { 0, 8, 32, 4, 2, 432, 5, 234, 54323, 875, 45 };
arr.Sort();
for (int i = 0; i < arr.Count; i++)
{
Console.Write("{0} ",arr[i]);
}
Console.ReadKey();
结果是:
...............................................................
0 2 4 5 8 32 45 234 432 875 54323
这是因为int类型继承了IComparable接口,因此可以排序
2.那么我们是否可以为自定义的类型进行排序呢,答案是一定的
我们想为Person这个类按照某种条件进行排序,那么首先它必须实现Icomparable接口,以及实现这个接口中的方法CompareTo
class Person : IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(object obj)
{
Person p = obj as Person;
if (p == null)
{
throw new ArgumentException();
}
else
{
return this.Age-p.Age;
//return this.Name.Length - p.Name.Length;
}
}
}按照年龄进行升序排序
结果是:
.........................................................................
Wayen Li
Alice Wang
Chris Sun
Jerry Huang
如果按照名字的长度进行排序的话,结果是
.........................................................................
Wayen Li
Chris Sun
Alice Wang
Jerry Huang
3.我们也可以定义一个类,继承自IComparer接口,用作比较器
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class PersonSortByAgeAsc : IComparer
{
#region IComparer 成员
public int Compare(object x, object y)
{
Person p1 = x as Person;
Person p2 = y as Person;
if (p1 != null && p2 != null)
{
return p1.Age - p2.Age;
}
else
{
throw new ArgumentException();
}
}
#endregion
}按年龄大小进行升序排列
ArrayList arr = new ArrayList() {
new Person(){ Name="Alice Wang", Age=19},
new Person(){ Name="Wayen Li", Age=12},
new Person(){ Name="Chris Sun", Age=21},
new Person(){ Name="Jerry Huang", Age=22}
};
.........................................................................
Wayen Li
Alice Wang
Chris Sun
Jerry Huang
ArrayList arr = new ArrayList() { 0, 8, 32, 4, 2, 432, 5, 234, 54323, 875, 45 };
arr.Sort();
for (int i = 0; i < arr.Count; i++)
{
Console.Write("{0} ",arr[i]);
}
Console.ReadKey();
结果是:
...............................................................
0 2 4 5 8 32 45 234 432 875 54323
这是因为int类型继承了IComparable接口,因此可以排序
2.那么我们是否可以为自定义的类型进行排序呢,答案是一定的
我们想为Person这个类按照某种条件进行排序,那么首先它必须实现Icomparable接口,以及实现这个接口中的方法CompareTo
class Person : IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(object obj)
{
Person p = obj as Person;
if (p == null)
{
throw new ArgumentException();
}
else
{
return this.Age-p.Age;
//return this.Name.Length - p.Name.Length;
}
}
}按照年龄进行升序排序
ArrayList arr = new ArrayList() { new Person(){ Name="Alice Wang", Age=19}, new Person(){ Name="Wayen Li", Age=12}, new Person(){ Name="Chris Sun", Age=21}, new Person(){ Name="Jerry Huang", Age=22} }; Console.WriteLine("排序之前:"); for (int i = 0; i < arr.Count; i++) { Console.WriteLine(((Person)arr[i]).Name); } //IComparable //升序排序 arr.Sort(); Console.WriteLine("排序之后:"); for (int i = 0; i < arr.Count; i++) { Console.WriteLine(((Person)arr[i]).Name); } Console.ReadKey();
结果是:
.........................................................................
Wayen Li
Alice Wang
Chris Sun
Jerry Huang
如果按照名字的长度进行排序的话,结果是
.........................................................................
Wayen Li
Chris Sun
Alice Wang
Jerry Huang
3.我们也可以定义一个类,继承自IComparer接口,用作比较器
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class PersonSortByAgeAsc : IComparer
{
#region IComparer 成员
public int Compare(object x, object y)
{
Person p1 = x as Person;
Person p2 = y as Person;
if (p1 != null && p2 != null)
{
return p1.Age - p2.Age;
}
else
{
throw new ArgumentException();
}
}
#endregion
}按年龄大小进行升序排列
ArrayList arr = new ArrayList() {
new Person(){ Name="Alice Wang", Age=19},
new Person(){ Name="Wayen Li", Age=12},
new Person(){ Name="Chris Sun", Age=21},
new Person(){ Name="Jerry Huang", Age=22}
};
//按照年龄升序排序 arr.Sort(new PersonSortByAgeAsc()); for (int i = 0; i < arr.Count; i++) { Console.WriteLine(((Person)arr[i]).Name); } Console.ReadKey();结果是:
.........................................................................
Wayen Li
Alice Wang
Chris Sun
Jerry Huang
相关文章推荐
- Android Native 绘图方法
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#比较二个数组并找出相同或不同元素的方法
- C#生成饼形图及添加文字说明实例代码
- C#判等对象是否相等的方法汇总