準備工作: 1.創建實體類:ClassInfo,預設想要對其按照班級學生數量進行排序 public class ClassInfo { /// <summary> /// 班級名稱 /// </summary> public string ClassName { get; set; } /// <s ...
準備工作:
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); });