我目前正在使用IQueryable OrderBy方法订购自定义对象列表,如下所示:
mylist.AsQueryable().OrderBy("PropertyName");
现在我希望按多个属性进行排序。有没有办法做到这一点?
谢谢, 雅尼斯
答案 0 :(得分:50)
OrderBy(i => i.PropertyName).ThenBy(i => i.AnotherProperty)
在OrderBy和ThenBy中你必须提供keySelector函数,它选择从对象中排序的键。因此,如果您只在运行时知道属性名称,那么您可以使用反射来创建这样的函数:
var propertyInfo = i.GetType().GetProperty("PropertyName");
var sortedList = myList.OrderBy(i => propertyInfo.GetValue(i, null))
但它会慢,然后直接进入财产。你也可以使用Linq.Expressions“动态”编译这样的函数,它比反射更快,但不是很容易。或者您可以在WPF中使用CollectionViewSource及其排序功能。
并且不要忘记OrderBy()返回已排序的枚举,并且它不会对现有的List进行排序。在您的示例中,您没有将排序列表保存到变量。
答案 1 :(得分:13)
您可以使用.ThenBy
:
var result = mylist
.AsQueryable()
.OrderBy(x => x.PropertyName)
.ThenBy(x => x.SomeOtherProperty);
答案 2 :(得分:6)
您可能希望使用ThenBy扩展方法来按多个字段排序
return myList.AsQueryable().OrderBy(m=>m.Property1).ThenBy(m => m.Property2);
如果您想要动态Linq,请查看LinqKit。我最近从here实现了Microsoft的动态Linq库,并且能够使用字符串对两个字段进行排序。
很棒的东西!不确定这是否在.NET 5中。
答案 3 :(得分:0)
正如其他人所建议的那样,您可以使用“ 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;
});