我正在尝试找出自定义排序列表的最佳方法。假设T是一个具有日期(DateTime?)属性和状态(字符串)属性的对象。
我有3个案例......
“紧急”:我希望这些在列表的顶部,没有特定的顺序
date = null
status =“紧急”
“正常”:我希望在紧急情况发生后按日期排序
date =任何有效日期/时间
status =“准时”
“稍后”:我希望这些在列表的底部,没有特定的顺序
date = null
status =“稍后”
有什么想法?我应该使用IQuerable对象而不是List吗?我总是可以.ToList()稍后将对象发送到我的视图。
答案 0 :(得分:38)
query = query.OrderBy(x =>
x.Status == "Urgent" ? 1:
x.Status == "Normal" ? 2:
3)
.ThenBy(x =>
x.Status == "Urgent" ? null:
x.Status == "Normal" ? x.Date:
null);
随机沉思:订购是属于查询还是属于类?
答案 1 :(得分:12)
不应该太困难,只需使用您的比较规则T
实施IComparable
,就应该设置。
答案 2 :(得分:2)
您需要提供IComparer的实现,然后您可以使用以下重载传递它:
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
IComparer<TKey> comparer
)
答案 3 :(得分:1)
我认为最简单的方法是使用linq:
itemsList = itemsList.OrderByDescending(ob => ob.status ).ThenBy(ob => ob.date).ToList();
答案 4 :(得分:0)
您可以使用扩展方法:
像这样......
public static IOrderedEmumerable<MyType> OrderForDisplay (this IEnumerable<MyType> input)
{
return
input
.OrderBy(item => item.Status)
.ThenByDescending(item => item.Status == 1 ? DateTime.MaxDate : item.date);
}