如何在Linq中对日期进行排序?

6

我正在使用C#和LINQ,我的一些日期是以Date类型存储的。

目前,我正在使用以下脚本按开始日期对列表进行排序,从早到晚。

但是使用以下代码后,我的事件没有被排序:

      events.OrderBy(x => x.DateTimeStart).ToList();    
      return events.AsQueryable();

这里可能出了什么问题?

1
请记住,AsQueryable()ToList()在底层数据结构不同时意义完全不同。 - flindeberg
3个回答

12

events.OrderBy(x => x.DateTimeStart).ToList()创建了一个新的列表,但你没有返回它。

你可能想要像这样:

return events.OrderBy(x => x.DateTimeStart).ToList(); 

感谢大家的回答! - GibboK

4

events.OrderBy(x => x.DateTimeStart): 声明一个按照属性DateTimeStart排序事件的查询,但是此时不执行该查询。

events.OrderBy(x => x.DateTimeStart).ToList();: 执行上述查询,遍历所有的events,检查它们的DateTimeStart并进行排序,将结果保存为List,然后......丢弃这个结果!因为你没有保存它。可以将其与以下内容进行比较:

int a = 0;
a + 1;
b = a; // b is 0

return events.OrderBy(e => e.Date).AsQueryable();: 在这里,你返回了原始的events而没有排序。

你应该按照以下方式编写代码:

return events.OrderBy(x => x.DateTimeStart).ToList().AsQueryable();

那个版本会创建一个排序后的静态事件列表。如果现在更改了 events 列表,结果将不会考虑到你的更改。
第二种解决方案是:
return events.OrderBy(x => x.DateTimeStart).AsQueryable();

那个版本无法工作。它只是声明了一种方式来排序事件并将该方式作为IQueryable返回。如果您在未来的代码中使用返回值,即使在使用之前添加新事件,它也将始终包含所有已排序的事件。


2

将您订购的事件存储在一个变量中,并将此变量作为可查询对象返回;

var orderedEvents = events.OrderBy(x => x.DateTimeStart).ToList();    

return orderedEvents.AsQueryable();

如果您不需要该变量,请直接返回已排序的事件。
return events.OrderBy(x => x.DateTimeStart).ToList().AsQueryable();

值得一提的是,ToList()将评估LINQ表达式并存储结果。之后,在该列表之上返回IQueryable是没有用处的。 - publicgk
是的,你说得对。我只是提供他更新后的代码。我不知道他为什么要返回它作为Queryable(); - Jehof
1
也许他想要的是类似这样的东西:return events.OrderBy(x => x.DateTimeStart).AsQueryable(); - publicgk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接