foreach(Element element in elements) { element.DoSomething();}
?
Ответ 1
Одно ключевое различие заключается в методе .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();
}
Ответ 2
скорее всего будет быстрее (вы не должны выбирать один за другим только из-за небольших преимуществ производительности, если только вы не работа с вычислительно тяжелым числом хруст или графическим приложением, и вам нужно получить максимальную отдачу от циклов процессора), и вы можете передать делегатам прямо к нему, что может быть удобно в некоторых случаях:
list.ForEach(Console.WriteLine); // dumps the list to console.
Ответ 3
Это более удобный способ/стенографию для выполнения действия над элементами в списке, MoreLinq расширяет эту функциональность для всех которые реализуют IEnumerable.