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();