列表上的自定义 OrderBy <T>

问题描述 投票:0回答:5

我正在尝试找出自定义列表排序的最佳方法。假设 T 是一个具有 date(DateTime?) 属性和 status(string) 属性的对象。

我有3个案例...

“紧急”:我希望这些位于列表顶部,没有特定顺序
日期=空
状态=“紧急”

“正常”:我希望在紧急情况之后按日期订购这些
日期 = 任何有效日期/时间
状态=“准时”

“稍后”:我希望这些位于列表底部,没有特定顺序
日期=空
状态=“稍后”

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

c# asp.net asp.net-mvc linq
5个回答
71
投票
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);

随机思考:排序属于查询,还是属于类?


17
投票

应该不会太难,只要使用你的比较规则让

T
实现
IComparable
就可以了。


2
投票

您可以只使用扩展方法:

类似这样的事情...

public static IOrderedEmumerable<MyType> OrderForDisplay (this IEnumerable<MyType> input)
{
  return
    input
    .OrderBy(item => item.Status)
    .ThenByDescending(item => item.Status == 1 ? DateTime.MaxDate : item.date);
}

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


2
投票

我认为最简单的方法是使用 linq :

itemsList = itemsList.OrderByDescending(ob => ob.status ).ThenBy(ob => ob.date).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.