C# 比較和排序(IComparable和IComparer以及它們的泛型實現)


 准備工作:

1.創建實體類:ClassInfo,默認想要對其按照班級學生數量進行排序

public class ClassInfo 
{

/// <summary>
/// 班級名稱
/// </summary>
public string ClassName { get; set; }


/// <summary>
/// 學生數量
/// </summary>
public int StudentCount { get; set; }

}

2.在控制台程序Main方法中,插入代碼

List<ClassInfo> classList = new List<ClassInfo>();
classList.Add(
new ClassInfo()
{
ClassName = "小一班",
StudentCount = 40
});
classList.Add(new ClassInfo()
{
ClassName = "小二班",
StudentCount = 39
});
foreach(var o in classList){
Console.WriteLine(string.Format("{0}:{1}", o.ClassName, o.StudentCount));
}
Console.ReadKey();

運行后,發現是按照增加對象的順序來顯示的。

3.嘗試使用對象默認的Sort進行排序

   classList.Sort();

   報錯,錯誤信息提示:必須至少有一個對象實現 IComparable。那么,如何實現自定義實體類的排序呢?下面開始一一陳述。


 基本概念

    比較:兩個實體類之間按>,=,<進行比較。

    排序:在集合類中,對集合類中的實體進行排序。排序基於的算法基於實體類提供的比較函數。

    C#對基本類型都提供了默認的比較和排序的算法,但比較復雜結構的實體類,需要用戶自己實現比較和排序的方法

1.IComparer

 在ClassInfo類中,繼承接口IComparer( IComparable<ClassInfo>),並實現接口中的CompareTo方法。

public int CompareTo(ClassInfo o)
{
return StudentCount.CompareTo(o.StudentCount);
}

運行,發現按照學生數量進行了升序顯示。

注意上面代碼中CompareTo方法,是利用了整型的默認比較方法。此處可以使用以下自定義代碼,可以將比較器的工作原理闡述的更清楚。

if (StudentCount > o.StudentCount)
    return 1;
else if (StudentCount == o.StudentCount)
    return 0;
else
    return -1;

2.IComparer:使用IComparer來實現一個自定義的比較器

public class SortByName : IComparer<ClassInfo>
{

public int Compare(ClassInfo x, ClassInfo y)
{
return x.ClassName.CompareTo(y.ClassName);
}

}

將Main()中,classList.Sort()改為 classList.Sort(new SortByName());

運行后,發現集合中的數據按名稱進行了排序。

3.使用lamda表達式實現比較排序:

 classList.Sort((ClassInfo obj1, ClassInfo obj2) => { return obj1.ClassName.CompareTo(obj2.ClassName); });

 


免責聲明!

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



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