我有一个名为Order
的类,它具有OrderId
, OrderDate
, Quantity
和Total
等属性。我有一个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);