Связь foreach с перечислителем в C#
Компилятор разворачивает foreach в вызов GetEnumerator, цикл while (MoveNext) и чтение Current. Если перечислитель реализует IDisposable, обёртка try/finally вызовет Dispose даже при исключении в теле цикла.
Для массива и списка это обычный обход: индекс ведёт компилятор. У списка есть защита от изменения набора во время прохода - добавление элемента бросает InvalidOperationException. Замена значения в ячейке массива так не проверяется.
Умножим коды заказа на 10. Компилятор сам получит перечислитель и будет вызывать MoveNext, пока элементы не кончатся. Порядок совпадает с порядком в массиве:
int[] ids = { 1, 2, 3 };
foreach (int id in ids)
{
Console.WriteLine(id * 10); // выведет 10, 20, 30
}
В массиве лежат цены 40 и 15. Обойдите его и выведите сумму.