for(int i = 0...)
Чтобы использовать эту методологию, у вас должен быть массив, к которому вы можете обращаться каждый элемент, один за другим.
foreach (SomeClass o in someList)
Этот синтаксис может использоваться для перечислимого класса, класса, который реализует IEnumerable
. IEnumerable имеет метод GetEnumerator()
, который знает, как пройти через каждый элемент коллекции.Теперь вышеприведенный массив реализует IEnumerable
.Способ, которым он знает, как перечислять через коллекцию, - это то, как вы определили это выше.Однако не все IEnumerable
классы, которые могут использовать синтаксис foreach, могут использовать первый метод, поскольку не все коллекции предоставляют доступ к каждому элементу.Рассмотрим следующую функцию (не проверял ее):
public IEnumerable<int> GetACoupleOfInts()
{
yield return 1;
yield return 2;
}
}
Этот метод позволит вам использовать конструкцию foreach
, так как среда выполнения знает, как перечислять череззначения GetACoupleInts()
, но не позволяют конструкцию for
.
someList.ForEach(o => o.someAction());
- Как я понимаю, эта лямбда будет просто преобразована в то же выражение, что и foreach (SomeClass o in someList)
someList.AsParallel().ForAll(o => o.someAction());
- Решая, использовать ли PLINQ или нет, вы должны решить, стоит ли "Сок стоит выжать".Если объем работы в someAction()
является тривиальным, то затраты времени выполнения при организации всех данных из одновременных действий будут ЧЕГО слишком высоки, и вам будет лучше делать это последовательно.
tl; dr - Первые три, скорее всего, приведут к одним и тем же вызовам и не окажут реального влияния на производительность, хотя они имеют разные значения в рамках.Четвертый вариант требует более тщательного рассмотрения перед использованием.