在C 語言中,要使類型對象可以排序,可以基於介面實現,主要的介面有IComparable\、IComparer\,當然我們還可以通過強大的LINQ進行排序。 IComparable\介面 ================= IComparable\定義由值類型或類實現的通用比較方法,以為排序實例創建 ...
在C#語言中,要使類型對象可以排序,可以基於介面實現,主要的介面有IComparable<T>、IComparer<T>,當然我們還可以通過強大的LINQ進行排序。
IComparable<T>介面
IComparable<T>定義由值類型或類實現的通用比較方法,以為排序實例創建類型特定的比較方法。該介面就一個CompareTo(T)方法,將當前實例與同一類型的另一個對象進行比較,並返回一個整數,該整數指示當前實例在排序順序中的位置是位於另一個對象之前、之後還是與其位置相同。
相關鏈接:https://msdn.microsoft.com/zh-cn/library/4d7sx9hd(v=vs.110).aspx
示例定義了一個學生類型
class Student : IComparable<Student>
{
public string Id { get; set; }
public string Name { get; set; }
public float Height { get; set; }
public override string ToString() {
return string.Format("{0} {1} {2:#0.00}", Name, Id, Height);
}
//基於學生身高進行排序
public int CompareTo(Student other) {
if(Height == other.Height) return 0;
else if(Height > other.Height) return 1;
else return -1;
}
}
var students = new List<Student>() {
new Student() { Id="0001",Name="張三",Height= 1.76f},
new Student() { Id="0004",Name="李四", Height=1.72f},
new Student() { Id="0003",Name="王五",Height=1.80f},
new Student() { Id="0005",Name="趙六",Height=1.69f}
};
Console.WriteLine("==========排序前===========");
foreach(var item in students) {
Console.WriteLine(item);
}
students.Sort();//排序
Console.WriteLine("==========排序後===========");
foreach(var item in students) {
Console.WriteLine(item);
}
Console.ReadKey(true);
IComparer<T>介面
IComparer<T>介面定義了兩個對象的比較方法,介面包含的方法Compare(T, T)對兩個對象進行比較,並返回指示一個是否小於、 等於還是大於另一個值。
使用IComparer<T>介面的好處在於可以定義多種對象的排序規則,並可以根據需要動態的配置排序方式。
相關鏈接:https://msdn.microsoft.com/zh-cn/library/8ehhxeaf(v=vs.110).aspx
實現基於學生Id和身高進行排序的規則
class StudentCompareWithId : IComparer<Student>
{
public int Compare(Student x, Student y) {
return string.Compare(x.Id, y.Id);
}
}
class StudentCompareWithHeight : IComparer<Student>
{
public int Compare(Student x, Student y) {
if(x.Height == y.Height) return 0;
else if(x.Height > y.Height) return 1;
else return -1;
}
}
var students = new List<Student>() {
new Student() { Id="0001",Name="張三",Height= 1.76f},
new Student() { Id="0004",Name="李四", Height=1.72f},
new Student() { Id="0003",Name="王五",Height=1.80f},
new Student() { Id="0005",Name="趙六",Height=1.69f}
};
Console.WriteLine("==========排序前===========");
foreach(var item in students) {
Console.WriteLine(item);
}
students.Sort(new StudentCompareWithId());//基於Id排序
Console.WriteLine("==========基於Id排序===========");
foreach(var item in students) {
Console.WriteLine(item);
}
students.Sort(new StudentCompareWithHeight());//基於Height排序
Console.WriteLine("==========基於Height排序===========");
foreach(var item in students) {
Console.WriteLine(item);
}
LINQ及擴展方法
通過LINQ及擴展方法對對象序列進行排序就更簡單了,只需一行代碼就搞定,當然他們只是寫法上的不同。
【LINQ】
var query = from s in students
orderby s.Height
select s;
【擴展方法】
LINQ擴展方法中的OrderBy()根據某個鍵按升序對序列的元素進行排序;OrderByDescending()降序排序。
var query = students.OrderBy(o => o.Height);
最後
實現類型對象序列的排序,如果是複雜的排序規則可以選擇繼承介面實現排序規則然後再調用序列的排序方法,如果只是想簡單的依賴對象的某個成員進行排序,通過LINQ及擴展方法是個很好的選擇。