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();
}