代码之家  ›  专栏  ›  技术社区  ›  Mathias

使用LINQ选择n最大

  •  3
  • Mathias  · 技术社区  · 14 年前

    这可能是关于LINQ的一个新手问题,但是假设我有一组具有日期时间属性的项,一个日期最多有一个项,我如何从引用日期中选择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 回复  |  直到 14 年前
        1
  •  5
  •   Aaronaught    14 年前

    是的,这是正确的方法。从字面上判断 dataContext 在这里,我假设这是linq-to-sql代码;它将变成一个高效的 TOP N 查询。

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

    我可能会改变的一件事是移除 ToList() . 除非你真的需要它 列表 它是 典型地 最好把它作为 IEnumerable<T> 尤其是当您只需要遍历它,而不是通过索引获取元素时。

    编辑:我应该证明我的意思 更好的 参考 ToList . 当你打电话 托利斯特 ,最终得到的内存结构包含 全部的 集合中的元素。这会耗尽你不需要一直使用的内存。创建列表还需要对所有记录进行完整的迭代,因此,如果稍后迭代列表本身,则需要对每个元素进行两次迭代。

    对于只有5种元素,差异可能不明显;但是,对于5000种元素,差异可能非常重要。因此,你应该养成不使用的习惯。 托尔斯特() 除非你确定你需要它。大多数时候,你不会。

        2
  •  3
  •   Coding Flow    14 年前

    是的,这就是怎么做的。

        3
  •  2
  •   eKek0    14 年前

    我觉得这很好。你也可以用一句话来表达:

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

    但你的方式也一样好。