Linq 查询 - 整理/优化

本文关键字:优化 整理 查询 Linq | 更新日期: 2023-09-27 18:33:29

我使用以下代码行:

ListOfMyClass.OrderByDescending(x => x.DateCreated)
             .Where(x => !x.Deleted).First();

我得到

"替换为单个呼叫到第一个警告"

我宁愿这样做,但无法弄清楚如何做。

我希望能够说出具有最新创建日期的项目,并且标记为未删除。

学习此类查询的最佳地点在哪里,解决此问题的最佳方法是什么,因为我更喜欢成为一名整洁的编码员。

Linq 查询 - 整理/优化

你可以在没有 where 的情况下调用它:

ListOfMyClass.OrderByDescending(x => x.DateCreated).First(x => !x.Deleted);

First也接受谓词。在这种情况下,无论您是编写WhereFirst,还是只是First将其评估为相同的查询,这真的无关紧要:)但First看起来更干净。

正如Jeroen van Langen所说WhereFirst略快。因此,我认为使用Where.OrderByDescending.First是迄今为止最好的解决方案。

这只是一个建议使用 First 的另一个重载,它接受内联谓词。这允许您仅用.First(...)替换.Where(...).First()

ListOfMyClass.OrderByDescending(x => x.DateCreated).First(x => !x.Deleted);

也就是说,编写查询的更好方法是

ListOfMyClass.Where(x => !x.Deleted)
             .OrderByDescending(x => x.DateCreated)
             .First();

此处上述"代码编写优化"不适用,但此版本在排序进行过滤。这可能会大大加快排序速度,具体取决于筛选出的项目百分比。对元素进行排序确实没有意义,您只是要忽略。

为了"满足"警告,您可以将其重写为:

ListOfMyClass.OrderByDescending(x => x.DateCreated)
             .First(x => !x.Deleted);

但我更喜欢在排序之前进行过滤,所以我会使用这个:

ListOfMyClass
             .Where(x => !x.Deleted)
             .OrderByDescending(x => x.DateCreated)
             .First();

我会把Where放在第一位,这样要排序的项目就更少了。

ListOfMyClass.Where(x => !x.Deleted).OrderByDescending(x => x.DateCreated).First();

另外,你可能想使用MaxBy fom MoreLinq:

ListOfMyClass.Where(x => !x.Deleted).MaxBy(x => x.DateCreated);
ListOfMyClass.Where(x=> !x.Deleted).OrderByDescending(x=>x.DateCreated).First();

。最新创建日期,标记为已删除...

如果你想要最新的,已删除的项目,你为什么要求非删除(!x.Deleted)?

我会建议这个:

var yourClassOrNull = ListOfMyClass
    .Where(x => x.Deleted)
    .OrderByDescending(x => x.DateCreated)
    .FirstOrDefault();

这是可读的,安全和高效的。它是安全的,因为FirstOrDefault返回与OrderByDescending订购的Where中的条件匹配的第一项。如果没有项目与条件匹配,则返回默认值,对于引用类型,如下所示null 。因此,您可以稍后if(yourClassOrNull != null) ...检查。

它非常高效,因为在 Linq-To-Object 中进行筛选后进行排序非常重要。