我正在使用以下代码行:
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
. 所以我认为 usingWhere.OrderByDescending.First
是迄今为止最好的解决方案。
这只是一个建议使用另一个重载,First
它接受一个内联谓词。这允许您替换.Where(...).First()
为.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();
此外,您可能想要使用MoreLinq的MaxBy:
ListOfMyClass.Where(x => !x.Deleted).MaxBy(x => x.DateCreated);
...创建的最新日期并标记为已删除...
如果您想要最新的已删除项目,为什么要要求未删除(!x.Deleted
)?
我建议这样做:
var yourClassOrNull = ListOfMyClass
.Where(x => x.Deleted)
.OrderByDescending(x => x.DateCreated)
.FirstOrDefault();
这是可读、安全和高效的。这是安全的,因为返回与ordered byFirstOrDefault
中的条件匹配的第一个项目。如果没有项目符合条件,则返回默认值,以防引用类型如 here 。所以你可以稍后检查。Where
OrderByDescending
null
if(yourClassOrNull != null) ...
它很有效,因为在 Linq-To-Objects 中过滤后进行排序很重要。
ListOfMyClass.Where(x=> !x.Deleted).OrderByDescending(x=>x.DateCreated).First();