Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询-整理/优化_C#_Linq_List - Fatal编程技术网

C# Linq查询-整理/优化

C# Linq查询-整理/优化,c#,linq,list,C#,Linq,List,我正在使用以下代码行: ListOfMyClass.OrderByDescending(x => x.DateCreated) .Where(x => !x.Deleted).First(); 我得到 “替换为对第一个警告的单次调用” 我更愿意这样做,但不知道怎么做 我想说的是,最新创建日期的项目,该项目被标记为未删除 哪里是学习这类查询的最佳地点,解决这类查询的最佳方法是什么,因为我更喜欢做一个整洁的程序员。这只是建议首先使用,,它接受一个内联谓词。这允

我正在使用以下代码行:

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

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

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

我想说的是,最新创建日期的项目,该项目被标记为未删除


哪里是学习这类查询的最佳地点,解决这类查询的最佳方法是什么,因为我更喜欢做一个整洁的程序员。

这只是建议首先使用
,它接受一个内联谓词。这允许您将
。其中(…).First()
替换为
。First(…)

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

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

在这里,上面的“代码编写优化”不适用,但此版本在排序之前进行过滤。这将大大加快排序速度,具体取决于过滤掉的项目百分比。对要忽略的元素进行排序是毫无意义的。

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

ListOfMyClass.OrderByDescending(x => x.DateCreated).First(x => !x.Deleted);
First
也接受谓词。在这种情况下,无论您是将
写入Where
First
,还是只将
First
计算为同一个查询:)都无关紧要,但
First
看起来更干净


正如Jeroen van Langen所说,
其中
第一个
稍快一些。因此,我假设使用Where.OrderByDescending.First是目前为止最好的解决方案。

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

ListOfMyClass.OrderByDescending(x => x.DateCreated)
             .First(x => !x.Deleted);
但我更喜欢在排序之前进行过滤,因此我会使用以下方法:

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

我会将
放在第一位,这样可以减少要排序的项目

ListOfMyClass.Where(x => !x.Deleted).OrderByDescending(x => x.DateCreated).First();
此外,您可能希望使用fom MoreLinq:

ListOfMyClass.Where(x => !x.Deleted).MaxBy(x => x.DateCreated);
…创建并标记为已删除的最新日期

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

我建议:

var yourClassOrNull = ListOfMyClass
    .Where(x => x.Deleted)
    .OrderByDescending(x => x.DateCreated)
    .FirstOrDefault();
这是可读、安全和高效的。这是安全的,因为
FirstOrDefault
返回与
中的条件匹配的第一项,其中
OrderByDescending
排序。如果没有与条件匹配的项目,则返回默认值,如果引用类型为空,则返回默认值。因此,您可以稍后检查(yourClassOrNull!=null)


它非常有效,因为在Linq to Objects中过滤后进行排序非常重要。

我认为不需要降序排序,因为您可以先使用最新的日期值。这只是如何操作,我被卡住了?@LmC:不,顺序是必需的。我认为使用Where before ordering是一种方法+1我认为不需要按降序排列,因为您可以使用first提取最新的日期值。这只是如何操作我被卡住了?@LmC单次调用first warning意味着您可以将
Where.first
替换为
first
:)我不会在
first()
中选择Where。查看此处了解更多信息:这是什么:
替换为对第一个警告的单个调用
?我怀疑这是确切的警告。除此之外,是什么工具发出了警告?@TimSchmelter,我认为这是ReSharper发出的警告。之前有什么好处可以过滤吗sorting@LmC,忽略我之前的陈述。若这是Linq到对象(我认为是),那个么where等的顺序和@Liam有关,我不确定。我假设
OrderByDescending
读取所有项目并将它们按O(nlogn)排序。我认为这取决于具体情况。如果是Linq to Objects,则延迟加载将创建一条SQL语句,这不会产生任何效果。我猜这是LINQ到对象,所以它是相关的。我考虑<代码> OrthDealDebug < /Cord> >其次是代码>第一个/代码>(<代码> OrDefault < /代码>),既不可读也不有效。这就是为什么MoreLinq中有一个
MaxBy
扩展方法。@Henrik:它和sql一样可读。而且
MaxBy
效率更高,但根本不清楚它是否是
Linq To Objects
,我假设他只想用.NET方法得到答案。另外,如果
.Where(x=>x.Deleted)
只重新订购了少量商品,订购它们并不昂贵。
ListOfMyClass.Where(x=> !x.Deleted).OrderByDescending(x=>x.DateCreated).First();
var yourClassOrNull = ListOfMyClass
    .Where(x => x.Deleted)
    .OrderByDescending(x => x.DateCreated)
    .FirstOrDefault();