首页 / .NET / 正文

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

6069 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)