C#基础教程之IComparable用法,实现List.sort()排序
List<T>.sort()可以实现对T的排序,比如List<int>.sort()执行后集合会按照int从小到大排序。如果T是一个自定义的Object,可是我们想按照自己的方式来排序,那该怎么办呢,其实可以用过IComparable接口重写CompareTo方法来实现。流程如下:
一.第一步我们申明一个类Person但是要继承IComparable接口:
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; namespaceTestIComparable { publicclassPerson:IComparable<Person> { publicstringName{get;set;} publicintAge{get;set;} publicintCompareTo(Personobj) { intresult; if(this.Name==obj.Name&&this.Age==obj.Age) { result=0; } else { if(this.Name.CompareTo(obj.Name)>0) { result=1; } elseif(this.Name==obj.Name&&this.Age>obj.Age) { result=1; } else { result=-1; } } returnresult; } publicoverridestringToString() { returnthis.Name+"-"+this.Age; } } }
二.然后在主函数里面调用sort方法即可.类就会按照姓名从小到大,如果姓名相同则按照年龄从小到大排序了。
publicclassProgram { publicstaticvoidMain(string[]args) { List<Person>lstPerson=newList<Person>(); lstPerson.Add(newPerson(){Name="Bob",Age=19}); lstPerson.Add(newPerson(){Name="Mary",Age=18}); lstPerson.Add(newPerson(){Name="Mary",Age=17}); lstPerson.Add(newPerson(){Name="Lily",Age=20}); lstPerson.Sort(); Console.ReadKey(); } }
三,如果不继承IComparable接口,我们该如何实现排序呢。可以使用Linq来实现。其实效果是一样的,只是如果类的集合要经常排序的话,建议使用继承接口的方法,这样可以简化sort的代码,而且更容易让人看懂。
publicstaticvoidMain(string[]args) { List<Person>lstPerson=newList<Person>(); lstPerson.Add(newPerson(){Name="Bob",Age=19}); lstPerson.Add(newPerson(){Name="Mary",Age=18}); lstPerson.Add(newPerson(){Name="Mary",Age=17}); lstPerson.Add(newPerson(){Name="Lily",Age=20}); lstPerson.Sort((x,y)=> { intresult; if(x.Name==y.Name&&x.Age==y.Age) { result=0; } else { if(x.Name.CompareTo(y.Name)>0) { result=1; } elseif(x.Name==y.Name&&x.Age>y.Age) { result=1; } else { result=-1; } } returnresult; }); Console.ReadKey(); }