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

Linq ForEach vs All Performance review

不,您在滥用All方法。查看文档

确定序列的所有元素是否满足条件。

它应该用于根据某些条件确定所有元素是真/假,而不是用于产生副作用

CCD_ 2用于副作用。如果您已经有List<T>预付款,您可以使用它。仅仅为了List.ForEach而调用ToList并创建新的List是不值得的。它添加了另一个O(n)运算。

简言之,不要使用All来治疗副作用,当你已经有了清单时,List.ForEach几乎是不可接受的。推荐的方法是使用您选择的循环,没有什么比这更好的了。

Ericlippert对ForEach有话要说,注意它在ModernUI应用程序中被删除,在.net的桌面版本中也可能被删除。

如果要检查是否所有元素都满足某个条件,请使用All

但是,如果您需要对每个元素执行一些操作,请不要使用All或任何其他LINQ谓词(WhereSelectAny等),因为它们旨在以纯函数的方式使用。您可以使用foreach .. in循环对元素进行迭代,或者如果您喜欢使用List<T>.ForEach方法。然而,正如您所提到的,它是List<T>的一部分,并使您的代码稍微难以更改(例如,从列表更改为另一个枚举)。

有关使用LINQ的"正确方法"的讨论,请参阅此处。


例如,您可以这样编写代码:

foreach (var u in GlobalDataModel.WellList
                                 .Where(u => u.RefProjectName == project.OldProjectName)) 
{
    u.RefProjectName = project.ProjectName;
}

更明显的是,副作用正在发生。此外,这将只在序列上迭代一次,跳过不满足条件的元素。