Предположительно, вы пытаетесь избежать исключения "Коллекция была изменена" в первом случае.
Действительно, единственный способ «отложить» это сделать копию коллекции, которая включает в себя полную итерацию исходной коллекции и добавление элементов в новую коллекцию:
var openedWindowsCopy = new List<Window>(OpenedWindows);
foreach (var window in openedWindowsCopy)
window.Close();
Кроме того, ваш второй метод действителен, хотя обычно, когда вам нужно очистить экземпляры в индексированной коллекции, такой как List<T>
, вы делаете это просто путем отсчета:
for (int i = OpenedWindows.Count - 1; i >= 0; i--)
OpenedWindows[i].Close();
Лично я не вижу причин усложнять проблему с большим количеством делегатов.