Array類簡介
Array類是C#中所有數組的基類。我們常用的[]聲明數組即為Array類的語法,我們可通過Array類提供的各種方法對C#中數組進行操作。最典型的就是數組排序
Array.Sort 解析
比較原理:
Array類型的比較方法,由IComparable接口和其中的CompareTo方法實現:
- IComparable 接口:定義由值類型或類實現的特定於類型的通用比較方法,旨在對其實例進行排序
- CompareTo(Object):指示當前實例在排序順序中的位置是在同一類型的第二個對象之前、之后還是與其相同。它由非泛型集合對象的方法自動調用,如Array.Sort(), 用於對數組中的每個成員進行排序。 如果自定義類或結構未實現IComparable,則無法對其成員進行排序,並且排序操作可以InvalidOperationException引發
普通數組類型:
由於數組如Int32已經繼承了IComparable, IComparable
因此我們無需對測試類繼承上述接口、定義比較方法等,可
直接使用其比較方法進行排序:
//待排數組
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其他屬性及方法
推薦佳作: