我有一个名为Order的类,它具有OrderId、OrderDate、Quantity和Total等财产。我有这个订单类的列表:
List<Order> objListOrder = new List<Order>();
GetOrderList(objListOrder); // fill list of orders
我想根据Order对象的一个属性对列表进行排序;例如通过订单日期或订单id。
如何在C#中执行此操作?
我有一个名为Order的类,它具有OrderId、OrderDate、Quantity和Total等财产。我有这个订单类的列表:
List<Order> objListOrder = new List<Order>();
GetOrderList(objListOrder); // fill list of orders
我想根据Order对象的一个属性对列表进行排序;例如通过订单日期或订单id。
如何在C#中执行此操作?
当前回答
订购列表的最简单方法是使用OrderBy
List<Order> objListOrder =
source.OrderBy(order => order.OrderDate).ToList();
如果要按多个列排序,如以下SQL查询。
ORDER BY OrderDate, OrderId
要实现这一点,您可以像下面这样使用ThenBy。
List<Order> objListOrder =
source.OrderBy(order => order.OrderDate).ThenBy(order => order.OrderId).ToList();
其他回答
订购列表的最简单方法是使用OrderBy
List<Order> objListOrder =
source.OrderBy(order => order.OrderDate).ToList();
如果要按多个列排序,如以下SQL查询。
ORDER BY OrderDate, OrderId
要实现这一点,您可以像下面这样使用ThenBy。
List<Order> objListOrder =
source.OrderBy(order => order.OrderDate).ThenBy(order => order.OrderId).ToList();
经典的面向对象解决方案
首先,我必须向LINQ的伟大致敬。。。。现在我们已经把它排除在外了
JimmyHoffa答案的变体。使用泛型时,CompareTo参数变为类型安全。
public class Order : IComparable<Order> {
public int CompareTo( Order that ) {
if ( that == null ) return 1;
if ( this.OrderDate > that.OrderDate) return 1;
if ( this.OrderDate < that.OrderDate) return -1;
return 0;
}
}
// in the client code
// assume myOrders is a populated List<Order>
myOrders.Sort();
当然,这个默认的可排序性是可重用的。也就是说,每个客户端不必冗余地重新写入排序逻辑。交换“1”和“-1”(或逻辑运算符,由您选择)可反转排序顺序。
我为List<T>制作了这个扩展方法。
扩展方法将您希望排序的属性作为解析字符串,然后使用List<T>的OrderBy方法。然后,它将原始列表的每个索引设置为有序列表的相同索引。
public static class ListExtensions {
public static void SortBy<T>(this List<T> list, string property, bool reverse = false) {
List<T> ordered = list.OrderBy(obj => obj.GetType().GetProperty(property).GetValue(obj, null)).ToList();
for (int i = 0; i < list.Count; i++)
list[i] = reverse ? ordered[list.Count - 1 - i] : ordered[i];
}
}
如果列表中的对象具有属性Name,则按如下方式对列表testList进行排序:
//For normal sorting order
testList.SortBy("Name");
//For reverse sorting order
testList.SortBy("Name", true);
我建议您将SortBy的名称更改为Prefix_SortBy。若要防止导入其他库时可能发生冲突。
我知道这种方法适用于字母和数字排序。其分选能力可能有限,但操作非常简单。
如果有一些重大的缺陷或问题,请告诉我,我已经编写了大约3个月的C#。
顺致敬意,
如果需要对列表进行排序,则可以使用sort方法,传递Comparison<T>委托:
objListOrder.Sort((x, y) => x.OrderDate.CompareTo(y.OrderDate));
如果您希望创建一个新的排序序列而不是就地排序,那么可以使用LINQ的OrderBy方法,如其他答案中所述。
//用于网格视图的完全通用排序
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);
}