协慌网

登录 贡献 社区

如何通过对象中的属性对 List <T> 进行排序

我有一个名为Order的类,它具有OrderIdOrderDateQuantityTotal等属性。我有一个Order类的列表:

List<Order> objListOrder = new List<Order>();
GetOrderList(objListOrder); // fill list of orders

现在我想基于Order对象的一个属性对列表进行排序,例如我需要按订单日期或订单 ID 对其进行排序。

我怎样才能在 C#中做到这一点?

答案

我能想到的最简单的方法是使用 Linq:

List<Order> SortedList = objListOrder.OrderBy(o=>o.OrderDate).ToList();

如果需要就地对列表进行排序,则可以使用Sort方法,传递Comparison<T>委托:

objListOrder.Sort((x, y) => x.OrderDate.CompareTo(y.OrderDate));

如果您更喜欢创建一个新的排序序列而不是就地排序,那么您可以使用 LINQ 的OrderBy方法,如其他答案中所述。

要在. Net2.0 上没有 LINQ 的情况下执行此操作:

List<Order> objListOrder = GetOrderList();
objListOrder.Sort(
    delegate(Order p1, Order p2)
    {
        return p1.OrderDate.CompareTo(p2.OrderDate);
    }
);

如果您使用的是. Net3.0,那么 LukeH 的答案就是您所追求的。

要对多个属性进行排序,您仍然可以在委托中执行此操作。例如:

orderList.Sort(
    delegate(Order p1, Order p2)
    {
        int compareDate = p1.Date.CompareTo(p2.Date);
        if (compareDate == 0)
        {
            return p2.OrderID.CompareTo(p1.OrderID);
        }
        return compareDate;
    }
);

这将为您提供降序 orderIds 的升序日期。

但是,我不建议坚持代表,因为这意味着很多地方没有代码重用。您应该实现IComparer并将其传递给您的Sort方法。看到这里

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 类,只需实例化它并将其传递给 Sort 方法:

IComparer<Order> comparer = new MyOrderingClass();
orderList.Sort(comparer);