使用LINQ选择n最大

Mat*_*ias 3 .net c# linq

这可能是一个关于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();
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*ght 5

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

(好吧,只要数据按日期索引,就"有效".)

我可能改变的一件事是删除ToList().除非你真的需要它作为一个列表,否则通常最好不要将它作为一个单独使用IEnumerable<T>,特别是如果你只需要迭代它而不是通过索引获取元素.

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

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