Linq 查询 - 整理/优化
本文关键字:优化 整理 查询 Linq | 更新日期: 2023-09-27 18:33:29
我使用以下代码行:
ListOfMyClass.OrderByDescending(x => x.DateCreated)
.Where(x => !x.Deleted).First();
我得到
"替换为单个呼叫到第一个警告"
我宁愿这样做,但无法弄清楚如何做。
我希望能够说出具有最新创建日期的项目,并且标记为未删除。
学习此类查询的最佳地点在哪里,解决此问题的最佳方法是什么,因为我更喜欢成为一名整洁的编码员。
你可以在没有 where 的情况下调用它:
ListOfMyClass.OrderByDescending(x => x.DateCreated).First(x => !x.Deleted);
First
也接受谓词。在这种情况下,无论您是编写Where
和First
,还是只是First
将其评估为相同的查询,这真的无关紧要:)但First
看起来更干净。
正如Jeroen van Langen所说Where
比First
略快。因此,我认为使用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 中进行筛选后进行排序非常重要。