我正在使用C#和LINQ,我在类型Date
目前我正在使用此脚本按开始日期,从早期到最晚来订购列表。
使用以下代码,我的事件未排序:
events.OrderBy(x => x.DateTimeStart).ToList();
return events.AsQueryable();
这里可能有什么问题?
答案 0 :(得分:12)
events.OrderBy(x => x.DateTimeStart).ToList()
会创建一个新列表,但您不会将其返回。
你可能想要像
这样的东西return events.OrderBy(x => x.DateTimeStart).ToList();
答案 1 :(得分: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 。如果您在将来的代码中使用返回值,它将始终包含所有已排序的事件,即使您在使用之前添加了新事件。
答案 2 :(得分:2)
将orderedevents存储在变量中并返回此变量asQueryable();
var orderedEvents = events.OrderBy(x => x.DateTimeStart).ToList();
return orderedEvents.AsQueryable();
或者如果您不需要该变量,则直接返回您订购的事件。
return events.OrderBy(x => x.DateTimeStart).ToList().AsQueryable();