C#實(shí)現(xiàn)集合自定義排序的三種方式
可以通過多種方式實(shí)現(xiàn)集合的自定義排序。以下是一些常見的方法:
1. 使用 List<T>.Sort 方法與自定義比較器
List<T>
類提供了一個(gè) Sort
方法,它允許傳遞一個(gè) IComparer<T>
接口的實(shí)現(xiàn)來自定義排序邏輯。
using System; using System.Collections.Generic; public class Person { public string Name { get; set; } public int Age { get; set; } } public class PersonComparer : IComparer<Person> { public int Compare(Person x, Person y) { // 按年齡升序排序 return x.Age.CompareTo(y.Age); // 如果想按名字排序,可以這樣做: // return x.Name.CompareTo(y.Name); // 或者,可以實(shí)現(xiàn)更復(fù)雜的排序邏輯 } } class Program { static void Main() { List<Person> people = new List<Person> { new Person { Name = "Alice", Age = 30 }, new Person { Name = "Bob", Age = 25 }, new Person { Name = "Charlie", Age = 35 } }; people.Sort(new PersonComparer()); foreach (var person in people) { Console.WriteLine($"{person.Name}, {person.Age}"); } } }
2. 使用 LINQ 的 OrderBy 方法與自定義鍵選擇器
如果不需要就地排序(即不修改原始集合),而是想創(chuàng)建一個(gè)已排序的新集合,可以使用 LINQ 的 OrderBy
方法。可以傳遞一個(gè)鍵選擇器函數(shù)來自定義排序邏輯。
using System; using System.Linq; class Program { static void Main() { var people = new List<Person> { new Person { Name = "Alice", Age = 30 }, new Person { Name = "Bob", Age = 25 }, new Person { Name = "Charlie", Age = 35 } }; var sortedPeople = people.OrderBy(p => p.Age).ToList(); foreach (var person in sortedPeople) { Console.WriteLine($"{person.Name}, {person.Age}"); } } }
如果想按多個(gè)屬性排序,可以使用 ThenBy
方法:
var sortedPeople = people.OrderBy(p => p.Age).ThenBy(p => p.Name).ToList();
3. 實(shí)現(xiàn) IComparable<T> 接口
如果你的類本身就應(yīng)該有一個(gè)默認(rèn)的排序順序,可以讓該類實(shí)現(xiàn) IComparable<T>
接口。這通常用于希望類的實(shí)例在任何情況下都按照相同的邏輯排序時(shí)。
public class Person : IComparable<Person> { public string Name { get; set; } public int Age { get; set; } public int CompareTo(Person other) { if (other == null) return 1; return this.Age.CompareTo(other.Age); } } // 然后可以直接使用 Sort 方法,不需要傳遞比較器 people.Sort();
注意,實(shí)現(xiàn) IComparable<T>
接口時(shí)也應(yīng)該重寫 Object.Equals
和 Object.GetHashCode
方法,以保持一致性,特別是在集合操作中(如使用哈希表時(shí))。然而,對(duì)于排序目的,只實(shí)現(xiàn) IComparable<T>
就足夠了。
以上就是C#實(shí)現(xiàn)集合自定義排序的三種方式的詳細(xì)內(nèi)容,更多關(guān)于C#集合自定義排序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#基于時(shí)間輪調(diào)度實(shí)現(xiàn)延遲任務(wù)詳解
在很多.net開發(fā)體系中開發(fā)者在面對(duì)調(diào)度作業(yè)需求的時(shí)候一般會(huì)選擇三方開源成熟的作業(yè)調(diào)度框架來滿足業(yè)務(wù)需求,但是有些時(shí)候可能我們只是需要一個(gè)簡易的延遲任務(wù)。本文主要分享一個(gè)簡易的基于時(shí)間輪調(diào)度的延遲任務(wù)實(shí)現(xiàn),需要的可以參考一下2022-12-12c#泛型學(xué)習(xí)詳解 創(chuàng)建線性鏈表
Visual C# 2.0 的一個(gè)最受期待的(或許也是最讓人畏懼)的一個(gè)特性就是對(duì)于泛型的支持。這篇文章將告訴你泛型用來解決什么樣的問題,以及如何使用它們來提高你的代碼質(zhì)量,還有你不必恐懼泛型的原因2014-01-01C#雙向鏈表LinkedList排序?qū)崿F(xiàn)方法
這篇文章主要介紹了C#雙向鏈表LinkedList排序?qū)崿F(xiàn)方法,涉及C#雙向鏈表的定義與排序技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08C# WinForm 判斷程序是否已經(jīng)在運(yùn)行,且只允許運(yùn)行一個(gè)實(shí)例,附源碼
本文主要介紹WinFrom程序中只允許運(yùn)行一個(gè)實(shí)例的方法,并有完整的代碼示例,希望能給需要的朋友一些幫助。2016-04-04