List<T>.sort()可以实现对T的排序,比如List<int>.sort()执行后集合会按照int从小到大排序。如果T是一个自定义的Object,可是我们想按照自己的方式来排序,那该怎么办呢,其实可以用过IComparable接口重写CompareTo方法来实现。流程如下:
一.第一步我们申明一个类Person但是要继承IComparable接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TestIComparable { public class Person : IComparable<Person> { public string Name { get ; set ; } public int Age { get ; set ; } public int CompareTo(Person obj) { int result; if ( this .Name == obj.Name && this .Age == obj.Age) { result = 0; } else { if ( this .Name.CompareTo(obj.Name) > 0) { result = 1; } else if ( this .Name == obj.Name && this .Age > obj.Age) { result = 1; } else { result = -1; } } return result; } public override string ToString() { return this .Name + "-" + this .Age; } } } |
二.然后在主函数里面调用sort方法即可.类就会按照姓名从小到大,如果姓名相同则按照年龄从小到大排序了。
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Program { public static void Main( string [] args) { List<Person> lstPerson = new List<Person>(); lstPerson.Add( new Person(){ Name= "Bob" ,Age=19}); lstPerson.Add( new Person(){ Name= "Mary" ,Age=18}); lstPerson.Add( new Person() { Name = "Mary" , Age = 17 }); lstPerson.Add( new Person(){ Name= "Lily" ,Age=20}); lstPerson.Sort(); Console.ReadKey(); } } |
三,如果不继承IComparable接口,我们该如何实现排序呢。可以使用Linq来实现。其实效果是一样的,只是如果类的集合要经常排序的话,建议使用继承接口的方法,这样可以简化sort的代码,而且更容易让人看懂。
public static void Main(string[] args) { List<Person> lstPerson = new List<Person>(); lstPerson.Add(new Person(){ Name="Bob",Age=19}); lstPerson.Add(new Person(){ Name="Mary",Age=18}); lstPerson.Add(new Person() { Name = "Mary", Age = 17 }); lstPerson.Add(new Person(){ Name="Lily",Age=20}); lstPerson.Sort((x,y) => { int result; if (x.Name == y.Name && x.Age == y.Age) { result = 0; } else { if (x.Name.CompareTo(y.Name) > 0) { result = 1; } else if (x.Name == y.Name && x.Age > y.Age) { result = 1; } else { result = -1; } } return result; }); Console.ReadKey(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?