问题描述
.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);
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册