本文为 C#高级编程(第十版) 读书笔记,整理学过的知识,便于忘记后重新拾起。
通过IComparable接口实现自定义类的数组元素排序
- 通过继承Icomparable接口实现类排序
Array类使用Quicksort算法对数组中的元素进行排序。Sort()方法需要数组中的元素实现Icomparable接口。
Icomparable接口只定义了一个方法CompareTo(),如果比较对象相等返回0,如果实例应该排在参数的前面返回小于0的值,否则返回大于0的值
示例:
//自定义类
public class Person{
public string FirstName;
public string LastName;
}
//拓展后的自定义类
Public class Person:IComparable<Person>
{
public string FirstName;
public string LastName;
public int CompareTo(Person other)
{
if(other==null){
return 1;
}
int result=string.Compare(this.LastName,other.LastName);
if(result==0){
result=string.Compare(this.FirstName,other.FirstName);
}
return result;
}
}
//使用
//声明一个数组
Person[] persons={
....
....
}
//排序
Array.Sort(persons);
2.通创建一个新类IComparer继承实现排序功能
如果Person对象的排序方式不同,或者不能修改在数组中作为元素的类,那么可以实现IComparer接口或IComparer接口。这两个接口定义了Compare(),要比较的类必须实现这两个接口之一。
代码如下:
//用于比较的枚举参数
public enum PersonCompareType
{
FirstName,
LastName.
}
//拓展Person比较功能的类
public class PersonComparer:IComparer<Person>
{
private PersonComparerType _compareType;
public PersonComparer(PersonComparerType comparerType)
{
_compareType=comparerType;
}
public int Compare(Person x,Persony)
{
if(x==null&&y==null)
{
return 0;
}
if(x==null)
{
return 1;
}
if(y==null)
{
return -1;
}
switch(_compareType)
{
case PersonCompareType.FirstName:
return string.Compaer(x.FirstName,y.FirstName);
case PersonCompareType.LastName:
return string.Compaer(x.LastName,y.LastName);
default:
throw new ArgumentException("unexpected compare type");
}
}
}
//使用
Array.sort(persons,new PersonComparer(PersonCompareType.FirstName));
3.通过委托参数实现排序功能(待补充…)
Array类还提供了Sort方法需要将一个委托作为参数。这个参数可以传递给方法,从而不依赖IComparable或者ICmparer接口实现类的比较排序。