使用LINQ选择前n个最大值

4

这可能是关于LINQ的初学者问题,但假设我有一组具有DateTime属性的Items,其中一个日期最多有一个项目,那么我如何选择最近的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个回答

5

是的,这是正确的方法。从里面的dataContext这个单词来看,我猜这是Linq to SQL代码;它将变成一个有效的TOP N查询。

(只要数据按日期索引就是“有效”的。)

我可能会改变的一件事是删除ToList()。除非你实际上需要它作为一个列表,否则最好将其保留为IEnumerable<T>,特别是如果你只需要迭代它而不是通过索引获取元素。

编辑:我应该说明一下我所说的ToList的“更好”。当你调用ToList时,你得到一个包含集合中所有元素的内存结构。这使用了你不总是需要使用的内存。创建列表还需要完整迭代所有记录,因此如果稍后迭代列表本身,则已经两次遍历了每个元素。

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


DataContext来自EF。感谢关于日期索引和使用ToList()的两条有用评论。在这种特定情况下,即使问题描述中没有提到原因,我仍然需要一个列表! - Mathias

3

是的,这就是如何做到的。


2
我认为这很好。您也可以用一句话来表达:
 var recentItems = (from item in dataContext.Items
              where item.Date<=date 
              orderby item.Date descending 
              select item).Take(5).ToList();

但是你的方法同样很好。

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