Array类的Sort()方法
- 默认的排序算法是,快排 QuickSort
Array.Sort(数组)
- 要使用此
Sort()方法对数组进行排序,则数组元素的类型必须已经实现了IComparable接口 已知以下类型已经实现了IComparable接口: StringInt32
当数组元素是自定义类,要对数组进行排序时:
若要要使用Array.Sort(数组)
- 则元素类必须实现
IComparable接口 - 这意味着,我们有机会有权利去修改自定义类
- 若我们没有机会没有权利去修改自定义类,但仍旧想对数组进行排序,那么
Array.Sort(数组,comparer)可以使用
IComparable接口
此接口只定义了一个方法,那就是CompareTo()
- 实例和参数对象相等,需返回0
- 实例想排在参数对象之前,需返回小于0的值
- 实例想排在参数对象之后,需返回大于0的值
示例: 对自定义的Person类,实现IComparable接口
public class Person : IComparable<Person>
{
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;
}
}
IComparer接口
若要使用Array.Sort(数组,comparer)
- comparer是一个实现了
IComparer的类的实例 IComparer定义了一个Compare()方法Compare()方法的返回值规则和IComparable接口的CompareTo()相同
Array.Sort(string数组):
string[] names = {
"c a",
"s",
"b",
"l g"
};
Array.Sort(names)
foreach(var name in names)
{
Console.Writeline(name);
}
输出:
b
c a
l g
s
Array.Sort(数组,comparer)
IComparer接口实现示例:对Person数组进行排序, 使用Array.Sort(数组,comparer)
Array.Sort(persons, new PersonComparer(PersonCompareType.FirstName));
foreach(var person in persons)
{
Console.WriteLine(person);
}
public class PersonComparer : IComparer<Person>
{
private PersonCompareType _compareType;
public PersonComparer(PersonCompareType compareType) =>
_compareType = compareType;
public int Compare(Person x, Person y)
{
if (x is null && y is null) return 0;
if (x is null) return 1;
if (y is null) return -1;
switch(_compareType)
{
case PersonCompareType.FirstName:
return string.Compare(x.FirstName, y.FirstName);
case PersonCompareType.LastName:
return string.Compare(x.LastName, y.LastName);
default:
throw ArgumentException("unexpected compare type");
}
}
}
public enum PersonCompareType
{
FirstName,
LastName
}