C# 泛型集合的自定義型別排序
阿新 • • 發佈:2020-11-14
一、泛型集合List<T>排序
經sort方法之後,採用了升序的方式進行排列的。
List<int> list = new List<int>() { 2, 4, 1, 3, 5, -2, 0, 10 }; Console.Write("排序前..."); foreach (var item in list) { Console.Write(item + "\t"); } list.Sort(); Console.WriteLine(); Console.WriteLine("排序後..."); foreach (var item in list) { Console.Write(item + "\t"); }
二、對自定義型別進行排序
定義一個普通類:
public class Person { public int Id { get; set; } public string Name { get; set; } }
接下來,將定義的Person例項化,排序;
List<Person> list = new List<Person>() { new Person(){Name="張叄",Id=1}, new Person() {Name="李四",Id=4 }, new Person() {Name="王五",Id=2 }, }; list.Sort(); foreach (var item in list) { Console.Write(item.Id); }
結果如下:
在int型別中實現了IComparable,所以可以通過Sort()直接排序;
int型別是實現了IComparable這個介面的。那麼如果讓自定義型別Person也可以排序,那麼試試實現該介面;
那麼將上面的程式碼修改一下看看
public class Person:IComparable { public int Id { get; set; } public string Name { get; set; } public int CompareTo(object obj) { Person p = obj as Person; return this.Id.CompareTo(p.Id); } }
結果如下:
三、對集合按照多種不同規則進行排序
實際使用中,經常需要對集合按照多種不同規則進行排序,這就需要定義其他比較規則,可以在Compare方法中定義,該方法屬於IComparer<T>泛型介面,請看下面的程式碼:
public class PersonNameDesc : IComparer<Person> { //存放排序器例項 public static PersonNameDesc NameDesc = new PersonNameDesc(); public int Compare(Person x, Person y) { return System.Collections.Comparer.Default.Compare(x.Name, y.Name); } }
Compare方法的引數為要進行比較的兩個同類型物件,返回值為int型別,返回值處理規則與CompareTo方法相同。其中的Comparer.Default返回一個內建的Comparer物件,用於比較兩個同類型物件。
下面用新定義的這個比較器對集合進行排序:
//================對集合按照多種不同規則進行排序========================= List< Person > list = new List<Person>() { new Person(){Name="張叄",Id=1}, new Person() {Name="李四",Id=4 }, new Person() {Name="王五",Id=2 }, new Person() {Name="李四",Id=6 }, new Person() {Name="王五",Id=3 }, }; list.Sort(PersonNameDesc.NameDesc); foreach (var item in list) { Console.Write(item.Name + "\t"); } Console.Read();
結果如下:
四、使用linq進行排序
sort方法的一個過載是Comparison<T>型別的引數;
那就看一下 Comparison<T>是怎麼一回事吧:
List<Person> list = new List<Person>() { new Person(){Name="張叄",Id=1}, new Person() {Name="李四",Id=4 }, new Person() {Name="王五",Id=2 }, new Person() {Name="李四",Id=6 }, new Person() {Name="王五",Id=3 }, }; //匿名委託 list.Sort((a, b) => a.Id - b.Id); foreach (Person p in list) { Console.WriteLine(p.Name + "\t" + p.Id); } Console.Read();
結果如下:
List<Person> list = new List<Person>() { new Person(){Name="張叄",Id=1}, new Person() {Name="李四",Id=4 }, new Person() {Name="王五",Id=2 }, new Person() {Name="李四",Id=6 }, new Person() {Name="王五",Id=3 }, }; var l = from p in list orderby p.Id descending select p; foreach (Person p in l) { Console.WriteLine(p.Name + "\t" + p.Id); } Console.Read();
結果如下:
今天的分享就到這裡了,好久沒寫過部落格了,加班多,太忙了,抽空複習一下基礎知