我有一个对象列表。那些物体具有各种领域,例如年龄和名字
现在有时我想按名字排序,有时候按年龄排序。有时候会增加订单,有时会降低订单。
现在我明白我应该在我的对象中实现Comparable接口并覆盖CompareTo方法。
但是,当我想支持各种排序订单时,我怎么能这样做呢?
我是否必须在我的对象中设置排序顺序,还是以某种方式通过sort方法调用传递排序顺序?
答案 0 :(得分:14)
方法调用可以做任何事情;不需要比较器:
list.Sort((x,y)=>string.Compare(x.Name,y.Name));
list.Sort((x,y)=>y.Age.CompareTo(x.Age)); // desc
list.Sort((x,y)=>x.Age.CompareTo(y.Age)); // asc
注意第二个是降序,通过在比较中交换x / y。
答案 1 :(得分:8)
如果您正在使用List<T>
,并且希望对列表进行排序,则Sort
函数会提供接受Comparison<T>
的重载。您可以使用它来为列表提供不同的比较。
例如,要对Age
进行排序:
list.Sort((x, y) => x.Age.CompareTo(y.Age));
要对Name
进行排序:
list.Sort((x, y) => string.Compare(x.Name, y.Name));
要按降序排序,只需反转参数即可。
或者,您可以使用LINQ在列表中创建各种查询,以您喜欢的顺序提供结果,但这不会对基础列表产生任何影响(无论是坏的还是好的由你决定):
var byAge = list.OrderBy(x => x.Age);
var byName = list.OrderBy(x => x.Name);
要按降序排序,请使用OrderByDescending
代替OrderBy
。
答案 2 :(得分:5)
你也可以使用LINQ来处理这个问题:
var sortedByAge = myList.OrderBy(i => i.Age);
var sortedByName = myList.OrderBy(i => i.Name);
如果您想要处理排序,可以使用List<T>.Sort(Comparison<T>)
:
// Sort by Age
myList.Sort( (l, r) => l.Age.CompareTo(r.Age) );
// Sort by Name
myList.Sort( (l, r) => l.Name.CompareTo(r.Name) );
答案 3 :(得分:1)
您可以使用linq
对对象数据进行排序类似这样的事情
var query = from cust in customers
orderby cust.Age ascending
select cust;
答案 4 :(得分:0)
您也可以使用
list.OrderByDescending(a => a.Age);
或
list.OrderByAscending(a => a.Age);