Вы ошибаетесь, считая, что если список повторяется в каком-то месте программы, его текущая позиция смещается при передаче в качестве параметра.
В списке нет текущего индекса или состояния. Это код клиента, который делает.
То, что делает foreach
, по сути, вызывает метод GetEnumerator
и использует IEnumerator
для продвижения вперед и чтения текущего значения. Как только вы передадите список в другое место, другой foreach
получит свой собственный IEnumerator
, который снова начинается с первого элемента.
Рассмотрим этот образец:
void InnerEnumerate (List<int> innerList)
{
foreach (var innerItem in innerList)
Console.WriteLine ("- inner item {0}", innerItem);
}
var outerList = new List<int> { 1, 2, 3 };
foreach (var outerItem in outerList) {
Console.WriteLine ("Outer item {0}", outerItem);
InnerEnumerate (outerList); // pass list as a parameter
}
Это вывод:
Outer item 1
- inner item 1
- inner item 2
- inner item 3
Outer item 2
- inner item 1
- inner item 2
- inner item 3
Outer item 3
- inner item 1
- inner item 2
- inner item 3
Как видите, foreach
независимы и ничего не знают друг о друге. Они всегда начинаются с самого начала.