Linq ForEach vs All Performance review
本文关键字:Performance review All vs ForEach Linq | 更新日期: 2023-09-27 18:00:33
大部分时间我使用All(并返回true)而不是ForEach。一直使用ALL而不是ForEach是一个好的做法吗(在IEnumerable的情况下),我知道ALL可以在IEnumarable上运行,而ForEach只在列表上运行
var wells = GlobalDataModel.WellList.Where(u => u.RefProjectName == project.OldProjectName);
if (wells.Any())
{
wells.All(u =>
{
u.RefProjectName = project.ProjectName;
return true;
});
}
var wellsList = GlobalDataModel.WellList.Where(u => u.RefProjectName == project.OldProjectName).ToList();
wellsList.ForEach(u => u.RefProjectName = project.ProjectName);
不,您在滥用All
方法。查看文档
确定序列的所有元素是否满足条件。
它应该用于根据某些条件确定所有元素是真/假,而不是用于产生副作用。
CCD_ 2用于副作用。如果您已经有List<T>
预付款,您可以使用它。仅仅为了List.ForEach
而调用ToList
并创建新的List
是不值得的。它添加了另一个O(n)运算。
简言之,不要使用All
来治疗副作用,当你已经有了清单时,List.ForEach
几乎是不可接受的。推荐的方法是使用您选择的循环,没有什么比这更好的了。
Ericlippert对ForEach有话要说,注意它在ModernUI应用程序中被删除,在.net的桌面版本中也可能被删除。
如果要检查是否所有元素都满足某个条件,请使用All
。
但是,如果您需要对每个元素执行一些操作,请不要使用All
或任何其他LINQ谓词(Where
、Select
、Any
等),因为它们旨在以纯函数的方式使用。您可以使用foreach .. in
循环对元素进行迭代,或者如果您喜欢使用List<T>.ForEach
方法。然而,正如您所提到的,它是List<T>
的一部分,并使您的代码稍微难以更改(例如,从列表更改为另一个枚举)。
有关使用LINQ的"正确方法"的讨论,请参阅此处。
例如,您可以这样编写代码:
foreach (var u in GlobalDataModel.WellList
.Where(u => u.RefProjectName == project.OldProjectName))
{
u.RefProjectName = project.ProjectName;
}
更明显的是,副作用正在发生。此外,这将只在序列上迭代一次,跳过不满足条件的元素。