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其他屬性及方法

推薦佳作:

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM