3

我使用 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);

但这也不起作用。任何人都可以帮忙吗?谢谢

4

2 回答 2

10

OrderBy并且ThenBy不会List就地排序 - 它会创建具有相同项目排序的新集合。

您必须使用已订购的列表重新分配您的列表:

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

或与ThenBy

events = events.OrderBy(e => e.Time.).ThenBy(e => e.AsrTime).ToList();
于 2013-04-06T17:01:09.507 回答
3

如果您只是作为单独的语句调用OrderBy,那绝对行不通。与所有 LINQ 方法一样,OrderBy它不会改变原始序列 - 而是返回一个应用了排序的序列。

所以你想要这样的东西:

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

或对于复合排序:

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

我强烈建议您不要调用e.Time.ToString(),当然也不要按字符串的长度排序。从根本上说,您对字符串表示不感兴趣,所以不要费心使用它。

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

了解 LINQ 的功能性质以及它通过使每个返回一个新序列来组合操作的方式非常重要,该新序列是对前一个序列应用操作的结果 - 通常是懒惰的。

于 2013-04-06T17:01:19.487 回答