首页 / .NET / 正文

.NET[C#]泛型集合List<T>中如何按照泛型的某个属性排序,除了Linq你还能想什么哪些方式?

6244 2评论 发布于: 2018-01-02 读完约需7分钟

问题描述

.NET[C#]泛型集合List<T>中如何按照泛型的某个属性排序?

比如有个类,它包含了OrderNumber,CreatedOn,Price以及Total等字段,现在有如下的代码片段:

登录后复制
List<Order> listOrder = new List<Order>(); GetOrderList(objListOrder); // 获取订单集合

那么,这里的listOrder 怎么样来排序呢?

方式一

最简单的方式就是使用Linq了,当然需要.NET Framework 3.5及以上的版本才可以。代码片段如下:

登录后复制
List<Order> orders = listOrder.OrderBy(o=>o.CreatedOn).ToList();

方式二

如果.NET Framework 是2.0的版本,又该怎么来实现呢?

登录后复制
List<Order> listOrder = GetOrderList(); listOrder.Sort( delegate(Order p1, Order p2) { return p1.CreatedOn.CompareTo(p2.CreatedOn); } );

.NET 3.0 版本

登录后复制
List<Order> orders = listOrder.Sort((x, y) => x.CreatedOn.CompareTo(y.CreatedOn));

或者:

如果你还需要按照多个属性排序呢?看接着往下看:

登录后复制
listOrder.Sort( delegate(Order p1, Order p2) { int compareDate = p1.Date.CompareTo(p2.CreatedOn); if (compareDate == 0) { return p2.OrderNumber.CompareTo(p1.OrderNumber); } return compareDate; } );

当然,在这里不推荐你使用委托(delegate)来实现,而应该实现一个ICompare的接口,如下:

登录后复制
public class MyOrderingClass : IComparer<Order> { public int Compare(Order x, Order y) { int compareDate = x.Date.CompareTo(y.Date); if (compareDate == 0) { return x.OrderID.CompareTo(y.OrderID); } return compareDate; } }

调用方法:

登录后复制
IComparer<Order> comparer = new MyOrderingClass(); listOrder.Sort(comparer);

方式三

实现一个泛型方法,如下:

登录后复制
public List<T> Sort_List<T>(string sortDirection, string sortExpression, List<T> data) { List<T> data_sorted = new List<T>(); if (sortDirection == "Ascending") { data_sorted = (from n in data orderby GetDynamicSortProperty(n, sortExpression) ascending select n).ToList(); } else if (sortDirection == "Descending") { data_sorted = (from n in data orderby GetDynamicSortProperty(n, sortExpression) descending select n).ToList(); } return data_sorted; } public object GetDynamicSortProperty(object item, string propName) { //Use reflection to get order type return item.GetType().GetProperty(propName).GetValue(item, null); }

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

上一篇: .NET[C#]中类型检测是用:typeof,GetType,还是is?

下一篇: [Bootstrap]Bootstrap 3中的sr-only css 样式类是什么?

本文永久链接码友网 » .NET[C#]泛型集合List<T>中如何按照泛型的某个属性排序,除了Linq你还能想什么哪些方式?

分享扩散:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册

热门评论

mdswd (2020-07-20 15:00)

感谢你的文章解决了我要的功能
回复 赞(0)

mdswd (2020-07-20 15:00)

感谢你的文章解决了我要的功能
回复 赞(0)