C# - Array.Sort()方法

Array类简介

Array类是C#中所有数组的基类。我们常用的[]声明数组即为Array类的语法,我们可通过Array类提供的各种方法对C#中数组进行操作。最典型的就是数组排序

Array.Sort 解析

比较原理:

Array类型的比较方法,由IComparable接口和其中的CompareTo方法实现

  • IComparable 接口:定义由值类型或类实现的特定于类型的通用比较方法,旨在对其实例进行排序
  • CompareTo(Object)指示当前实例在排序顺序中的位置是在同一类型的第二个对象之前、之后还是与其相同。它由非泛型集合对象的方法自动调用,如Array.Sort(), 用于对数组中的每个成员进行排序。 如果自定义类或结构未实现IComparable,则无法对其成员进行排序,并且排序操作可以InvalidOperationException引发

普通数组类型:

由于数组如Int32已经继承了IComparable, IComparable等接口(注:int是Int32结构体);string继承了IComparable, IComparable等接口(注:string是String类)。
因此我们无需对测试类继承上述接口、定义比较方法等,可直接使用其比较方法进行排序


//待排数组
int[] arr = { 9, 4, 5, 3, 3, 2, 2, 1, 0, -1 };
string[] str = { "张三", "李四", "王五" };

//默认情况
Array.Sort(arr);	//-1 0 1 2 2 3 3 4 5 9
Array.Sort(str);	//李四 王五 张三


//Lambda 隐式return方法:
Array.Sort(arr, (p1, p2) => p1.CompareTo(p2));	//-1 0 1 2 2 3 3 4 5 9
Array.Sort(arr, (p1, p2) => p2.CompareTo(p1));	//9 5 4 3 3 2 2 1 0 -1
Array.Sort(str, (p1, p2) => p1.CompareTo(p2));	//李四 王五 张三
Array.Sort(str, (p1, p2) => p2.CompareTo(p1));	//张三 王五 李四

//Lambda 显示return方法:
Array.Sort(arr, (p1, p2) =>
{
    if (p1 > p2)
        return 1;
    else if (p1 < p2)
        return -1;
    else
        return 0;
});	//-1 0 1 2 2 3 3 4 5 9

自定义类型:

由于我们自定义的类型(单、多个待比较参数)未自动继承IComparable等接口,因此想要对该类的实例进行特殊规则排序时,需要自行继承、并实现比较方法

//自定义待排数据类
class Person : IComparable
{
	//属性:姓名、性别
    public string Name { get; set; }
    public string Sex { get; set; }

	//构造函数初始化
    public Person(string name, string sex)
    {
        Name = name;
        Sex = sex;
    }

	//重写打印格式
    public override string ToString()
    {
        return Name + " " + Sex;
    }

	//实现Person类比较方法:优先姓名升序,同名则性别升序
    public int CompareTo(object obj)
    {
        Person p = obj as Person;
        if (!Name.Equals(p.Name))
            return Name.CompareTo(p.Name);
        else
            return Sex.CompareTo(p.Sex);
    }
}

//测试类
class Test
{
	static void Main()
	{
		//创建自定义类型待排数组persons
        Person[] persons =
        {
            new Person("张三", "Female"),
            new Person("李四", "Male"),
            new Person("王五", "Female"),
            new Person("王五", "Male")
        };

		//自动使用Person类中的CompareTo比较方法
        Array.Sort(persons);
        foreach (Person p in persons)
            Console.WriteLine(p);
		/*
		李四 Male
		王五 Female
		王五 Male
		张三 Female
		*/
	}
}

Array其他属性及方法

推荐佳作:

参考

posted @ 2019-11-25 21:19  SouthBegonia  阅读(9397)  评论(0编辑  收藏  举报