自定义OrderBy列表<t> </t>

时间:2011-03-11 20:55:03

标签: c# asp.net asp.net-mvc linq

我正在尝试找出自定义排序列表的最佳方法。假设T是一个具有日期(DateTime?)属性和状态(字符串)属性的对象。

我有3个案例......

“紧急”:我希望这些在列表的顶部,没有特定的顺序
date = null
status =“紧急”

“正常”:我希望在紧急情况发生后按日期排序 date =任何有效日期/时间
status =“准时”

“稍后”:我希望这些在列表的底部,没有特定的顺序
date = null
status =“稍后”

有什么想法?我应该使用IQuerable对象而不是List吗?我总是可以.ToList()稍后将对象发送到我的视图。

5 个答案:

答案 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
)

请参阅:http://msdn.microsoft.com/en-us/library/bb549422.aspx

答案 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);
}
相关问题