6

我正在使用 C# 和 LINQ,我有一些日期类型Date

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

使用以下代码,我的事件未排序:

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

这里有什么问题?

4

3 回答 3

12

events.OrderBy(x => x.DateTimeStart).ToList()创建一个新列表,您不会返回它。

你可能想要类似的东西

return events.OrderBy(x => x.DateTimeStart).ToList(); 
于 2013-02-22T08:09:24.750 回答
4

events.OrderBy(x => x.DateTimeStart):声明一个按属性DateTimeStart对事件进行排序的查询。查询尚未执行。

events.OrderBy(x => x.DateTimeStart).ToList();:处理上一个查询。遍历所有事件,检查它们的DateTimeStart,对它们进行排序并将结果作为List安全,然后......丢弃结果!因为你没有保护它。将其与类似的东西进行比较:

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

return events.AsQueryable();:在这里,您将返回原始事件而不是排序。

您应该按如下方式编写代码:

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

该版本将创建排序事件的静态列表。如果现在您更改事件列表,结果将不会考虑您的更改。

第二种解决方案是:

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

该版本将不起作用。它只是声明了一种对事件进行排序的方式并将该方式返回为IQueryable。如果您在以后的代码中使用返回值,它将始终包含所有排序的事件,即使您在使用之前添加新事件也是如此。

于 2013-02-22T08:33:53.040 回答
2

将您的有序事件存储在一个变量中,并将该变量作为Queryable() 返回;

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

return orderedEvents.AsQueryable();

或者,如果您不需要该变量,则直接返回您订购的事件。

return events.OrderBy(x => x.DateTimeStart).ToList().AsQueryable();
于 2013-02-22T08:09:31.280 回答