我正在使用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);
但这也不起作用。有人可以帮忙吗?感谢
答案 0 :(得分:9)
OrderBy
和ThenBy
未对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的功能性以及通过使每个返回一个新序列来组成操作非常重要,这是将操作应用于前一个序列的结果 - 通常很懒散。