Есть ответы, которые утверждают, что то, что вы хотите, не может быть достигнуто с помощью foreach. Это утверждение неверно, все, что вам нужно сделать, это написать собственный класс с пользовательским перечислителем.
public class CustomList : IEnumerable<int>
{
readonly List<int> list = new List<int>{1,2,3,4};
private int now = 0;
public void Add(int n)
{
list.Add(n);
}
public IEnumerator<int> GetEnumerator()
{
while (now<list.Count)
{
yield return list[now];
now++;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Теперь следующий фрагмент кода выведет на экран 1,2,3,4 и 100:
var list = new CustomList();
foreach (int n in list)
{
if(n==1)
list.Add(100);
Console.WriteLine(n);
}
Но я пишу это только в качестве доказательства концепции. Вы не хотите делать это. Если вы будете добавлять только новые элементы на обороте, используйте Очередь, как говорили другие. Если вы всегда будете добавлять новые предметы на фронт, используйте Stack. Если вам понадобится и то и другое, напишите собственный класс LinkedList с операциями Dequeue (= Pop), Enqueue и Push, используйте что-то вроде:
while(list.notEmpty())
var item = list.Dequeue();
//bla bla
и все готово. (Вы могли бы даже написать собственный Enumerator снова, чтобы использовать его с foreach, но мы уничтожаем список по ходу работы, так что это противоречит духу перечислений, и зачем в любом случае беспокоиться)