2

我正在使用以下代码行:

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

我得到

“替换为对第一个警告的单次调用”

我更愿意这样做,但不知道怎么做。

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

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

4

6 回答 6

6

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

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

First也接受谓词。Where如果您编写并且First在这种情况下或者只是First将其评估为相同的查询,这真的没关系:) 但First看起来更干净。

正如 Jeroen van Langen 所说Where,比First. 所以我认为 usingWhere.OrderByDescending.First是迄今为止最好的解决方案。

于 2013-10-01T08:59:26.533 回答
5

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

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

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

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

这里上面的“代码编写优化”不适用,但是这个版本在排序之前过滤。这可以大大加快排序速度,具体取决于过滤掉的项目百分比。对您将忽略的元素进行排序确实没有任何意义。

于 2013-10-01T08:59:25.633 回答
2

要“满足”警告,您可以将其重写为:

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

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

ListOfMyClass
             .Where(x => !x.Deleted)
             .OrderByDescending(x => x.DateCreated)
             .First();
于 2013-10-01T09:00:57.150 回答
1

我会放第Where一个,所以要排序的项目更少。

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

此外,您可能想要使用MoreLinq的MaxBy:

ListOfMyClass.Where(x => !x.Deleted).MaxBy(x => x.DateCreated);
于 2013-10-01T09:02:25.697 回答
0

...创建的最新日期并标记为已删除...

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

我建议这样做:

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

这是可读、安全和高效的。这是安全的,因为返回与ordered byFirstOrDefault中的条件匹配的第一个项目。如果没有项目符合条件,则返回默认值,以防引用类型如 here 。所以你可以稍后检查。WhereOrderByDescendingnullif(yourClassOrNull != null) ...

它很有效,因为在 Linq-To-Objects 中过滤后进行排序很重要。

于 2013-10-01T09:04:28.973 回答
0
ListOfMyClass.Where(x=> !x.Deleted).OrderByDescending(x=>x.DateCreated).First();
于 2013-10-01T09:03:28.280 回答