Linq ForEach vs All Performance评论

时间:2014-04-29 04:51:52

标签: c# linq

在大多数情况下,我使用All(并返回true)而不是ForEach。使用ALL而不是ForEach是一个好习惯(在IEnumerable的情况下),我理解All可以在IEnumerable上运行而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);

2 个答案:

答案 0 :(得分:4)

不,你正在滥用All方法。看看documentation

  

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

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

List.ForEach用于副作用。如果您已预先List<T>,则可以使用它。仅仅为了ToList而调用List并创建新的List.ForEach是不值得的。它增加了另一个O(n)操作。

简而言之,不要使用All副作用,List.ForEach在您已有列表时几乎无法接受。推荐的方法是使用你选择的循环,没有比这更好的了。

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

答案 1 :(得分:2)

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

但是,如果您需要对每个元素执行一些操作,请不要使用All或任何其他LINQ谓词(Where,{{1} },Select等),因为它们意味着以纯粹的功能方式使用。您可以使用Any循环迭代元素,或者如果您更喜欢使用List<T>.ForEach方法。但是,正如您所提到的,它是foreach .. in的一部分,会使您的代码更难以更改(例如,从列表到另一个可枚举的代码)。

See here讨论&#34;正确方式&#34;使用LINQ。


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

List<T>

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