在大多数情况下,我使用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);
答案 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>
更明显的是副作用正在进行中。此外,这只会在序列上迭代一次,跳过不满足条件的元素。