我想知道为什么List<T>.ForEach(Action<T>)
存在。
是否有任何好处/差异:
elements.ForEach(delegate(Element element){ element.DoSomething(); });
在
foreach(Element element in elements) { element.DoSomething();}
答案 0 :(得分:34)
一个关键的区别是.ForEach方法可以修改底层集合。使用foreach语法,如果这样做,您将获得异常。这是一个例子(不是最好看,但它有效):
static void Main(string[] args) {
try {
List<string> stuff = new List<string>();
int newStuff = 0;
for (int i = 0; i < 10; i++)
stuff.Add(".");
Console.WriteLine("Doing ForEach()");
stuff.ForEach(delegate(string s) {
Console.Write(s);
if (++newStuff < 10)
stuff.Add("+"); // This will work fine and you will continue to loop though it.
});
Console.WriteLine();
Console.WriteLine("Doing foreach() { }");
newStuff = 0;
foreach (string s in stuff) {
Console.Write(s);
if (++newStuff < 10)
stuff.Add("*"); // This will cause an exception.
}
Console.WriteLine();
}
catch {
Console.WriteLine();
Console.WriteLine("Error!");
}
Console.ReadLine();
}
答案 1 :(得分:14)
它是very likely to be faster(你不应该只选择一个而不仅仅是因为它具有很小的性能优势,除非你正在处理计算量大的数字运算或图形应用程序,你需要充分利用处理器你可以直接将代表传递给它,在某些情况下可能很方便:
list.ForEach(Console.WriteLine); // dumps the list to console.
答案 2 :(得分:0)
对列表中的项执行操作是一种更方便的方式/简写,MoreLinq为实现IEnumerable的所有人扩展了此功能。