如何在c#中的timespan字段上排序?

时间:2013-04-06 16:58:39

标签: c#

我正在使用C#。我有一个事件清单:

List<Event> events = new List<Event>();

每个事件都有名称和时间。因此,如果您要查看列表,您会看到类似的内容:

Event A | 18:00
Event B | 18:30
Event C | 18:45
Event D | 18:15

我一直试图在事件发生时按顺序排列,但似乎没有效果。我在我的控制器中使用了这个:

events.OrderBy(e => e.Time);

在线查看之后,我看到有些人使用OrderBy和ThenBy,所以我尝试了:

events.OrderBy(e => e.Time.ToString().Length).ThenBy(e => e.Time);

但这也不起作用。有人可以帮忙吗?感谢

2 个答案:

答案 0 :(得分:9)

OrderByThenBy未对List进行排序 - 它会创建具有相同项目排序的新集合。

您必须使用有序的一个重新分配您的列表:

events = events.OrderBy(e => e.Time).ToList();

ThenBy

events = events.OrderBy(e => e.Time.).ThenBy(e => e.AsrTime).ToList();

答案 1 :(得分:3)

如果你只是调用OrderBy作为一个单独的声明,那肯定是行不通的。与所有LINQ方法一样,OrderBy不会改变原始序列 - 而是返回应用了排序的 new 序列。

所以你想要这样的东西:

var orderedEvents = events.OrderBy(e => e.Time);

或复合排序:

var orderedEvents = events.OrderBy(e => e.Time).ThenBy(e => e.AsrTime);

我强烈建议您致电e.Time.ToString(),当然也不要通过字符串的长度订购。从根本上说,你对字符串表示不感兴趣,所以不要费心使用它。

如果需要,您可以在结果上调用ToList(),但如果您只想迭代一次,那么实现结果就没什么意义了。如果您要多次迭代它,调用ToList将确保排序只需要发生一次,而不是每次重复进行。

理解LINQ的功能性以及通过使每个返回一个新序列来组成操作非常重要,这是将操作应用于前一个序列的结果 - 通常很懒散。