c# 高级编程 7章157页 【数组的排序】

152 阅读1分钟

Array类的Sort()方法

  • 默认的排序算法是,快排 QuickSort

Array.Sort(数组)

  • 要使用此Sort()方法对数组进行排序,则数组元素的类型必须已经实现了IComparable接口 已知以下类型已经实现了IComparable接口:
  • String
  • Int32

当数组元素是自定义类,要对数组进行排序时:

若要要使用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
}