使用LINQ选择n最大

时间:2010-05-10 23:52:47

标签: c# .net linq

这可能是一个关于LINQ的新手问题,但假设我有一组具有DateTime属性的项目,一个日期最多只有一个项目,我将如何从参考日期中选择N个最新项目,即,日期小于请求日期的N个项目和最大日期?
我天真的想法是首先选择日期小于参考日期的项目,按日期排序,然后从该子集中选择N个第一项。

 var recentItems = from item in dataContext.Items
              where item.Date<=date 
              orderby item.Date descending 
              select item;

 var mostRecentItems = recentItems.Take(5).ToList();

这是“正确”的方式,还是有更好的方法来实现我的目标?

3 个答案:

答案 0 :(得分:5)

是的,这是正确的方法。从那里的单词dataContext判断,我假设这是Linq to SQL代码;它将变为高效的TOP N查询。

(好吧,只要数据按日期编制索引就“有效”。)

我可能会更改的一件事是删除ToList()。除非你确实需要它作为列表,否则通常更好地将它作为IEnumerable<T>单独使用,特别是如果你只需要将它作为一个迭代反对通过索引获取元素。

编辑:我应该参考ToList来确定更好的含义。当您调用ToList时,最终会得到一个内存结构,其中包含所有元素集。这会耗尽您并不总是需要使用的内存。创建列表还需要对所有记录进行完整迭代,因此如果您稍后迭代列表本身,则您已经遍历了每个元素两次。

只有5个元素,差异可能不明显;然而,对于5000个元素,它可能非常重要。因此,您应该养成不使用ToList()的习惯,除非您确定需要它。大多数情况下,你没有。

答案 1 :(得分:3)

是的,这究竟是怎么做的。

答案 2 :(得分:2)

我认为这很好。你也可以用一句话来做这件事:

 var recentItems = (from item in dataContext.Items
              where item.Date<=date 
              orderby item.Date descending 
              select item).Take(5).ToList();

但你的方式同样好。