【发布时间】:2023-03-14 01:49:01
【问题描述】:
我目前正在使用 IQueryable OrderBy 方法对自定义对象列表进行排序,如下所示:
mylist.AsQueryable().OrderBy("PropertyName");
现在我希望按多个属性进行排序。有没有办法做到这一点?
谢谢, 雅尼斯
【问题讨论】:
标签: c# linq sorting c#-4.0 iqueryable
我目前正在使用 IQueryable OrderBy 方法对自定义对象列表进行排序,如下所示:
mylist.AsQueryable().OrderBy("PropertyName");
现在我希望按多个属性进行排序。有没有办法做到这一点?
谢谢, 雅尼斯
【问题讨论】:
标签: c# linq sorting c#-4.0 iqueryable
OrderBy(i => i.PropertyName).ThenBy(i => i.AnotherProperty)
在 OrderBy 和 ThenBy 中你必须提供 keySelector 函数,它从对象中选择 key 进行排序。因此,如果您只在运行时知道属性名称,那么您可以使用 Reflection 制作这样的函数,例如:
var propertyInfo = i.GetType().GetProperty("PropertyName");
var sortedList = myList.OrderBy(i => propertyInfo.GetValue(i, null))
但是会比较慢,然后直接访问属性。您也可以使用 Linq.Expressions 即时“编译”此类函数,它的工作速度比反射快,但它不是很容易。或者您可以在 WPF 中使用 CollectionViewSource 及其排序功能。
并且不要忘记 OrderBy() 返回排序后的可枚举并且它不会对您现有的列表进行就地排序。在您的示例中,您没有将排序列表保存到变量中。
【讨论】:
var propertyInfo = i.GetType().GetProperty("PropertyName"); myList.OrderBy(i => propertyInfo.GetValue(i, null)) 但它会更慢,然后直接访问属性。您也可以使用 Expressiosn 即时“编译”此类函数,它的工作速度比表达式快,但并不容易。或者您可以在 WPF 中使用 CollectionViewSource 及其排序功能
你可以使用.ThenBy:
var result = mylist
.AsQueryable()
.OrderBy(x => x.PropertyName)
.ThenBy(x => x.SomeOtherProperty);
【讨论】:
正如其他人所建议的,您可以使用“ThenBy”。如果您想在使用之前将字符串转换为不同的值,这也是可能的,例如...
var sortedSystemTestResultsList = systemTestResultsList.OrderBy(s =>
{
DateTime dt;
if (!DateTime.TryParse(s.testPointCompletedDate, out dt)) return DateTime.MaxValue;
return dt;
}).ThenBy(s =>
{
Int32 tpID;
if (!Int32.TryParse(s.testRunResultID, out tpID)) return Int32.MaxValue;
return tpID;
});
【讨论】: