列表上的自定义 OrderBy

发布于 2024-10-21 19:52:26 字数 347 浏览 1 评论 0原文

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

我有 3 个案例...

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

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

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

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

I'm trying to figure out the best way to custom sort a List. Lets say that T is a Object with a date(DateTime?) property and a status(string) property.

I have 3 cases...

"Urgent": I want these at the top of the list, no particular order
date = null
status = "Urgent"

"Normal": I want these ordered by date after the Urgent cases
date = any valid date/time
status = "On Time"

"Later": I want these at the bottom of the list, no particular order
date = null
status = "Later"

Any thoughts? Should I use an IQuerable object instead of List? I can always .ToList() the object later to send to my view.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

等待圉鍢 2024-10-28 19:52:26
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);

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

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);

Random musing: Does Ordering belong to the query, or to the class?

缱绻入梦 2024-10-28 19:52:26

应该不会太难,只需让 T 实现 IComparable 使用您的比较规则,您应该被设置。

Shouldn't be too difficult, just make T implement IComparable using your comparison rules and you should be set.

春花秋月 2024-10-28 19:52:26

您可以只使用扩展方法:

像这样......

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

You could just use an extension method:

Something like this...

public static IOrderedEmumerable<MyType> OrderForDisplay (this IEnumerable<MyType> input)
{
  return
    input
    .OrderBy(item => item.Status)
    .ThenByDescending(item => item.Status == 1 ? DateTime.MaxDate : item.date);
}
百善笑为先 2024-10-28 19:52:26

您需要提供 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

You will need to provide an implementation of IComparer, and then you can pass it in using the following overload:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer
)

See: http://msdn.microsoft.com/en-us/library/bb549422.aspx

盛夏已如深秋| 2024-10-28 19:52:26

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

itemsList = itemsList.OrderByDescending(ob => ob.status ).ThenBy(ob => ob.date).ToList();

The easiest way in my opinion is to use linq :

itemsList = itemsList.OrderByDescending(ob => ob.status ).ThenBy(ob => ob.date).ToList();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文