Во-первых, я знаю, что это невозможно из-за очевидных причин.
foreach(string item in myListOfStrings) {
myListOfStrings.Remove(item);
}
Перевернутый выше - одна из самых ужасных вещей, которые я когда-либо видел. Итак, как вы это достигаете? Вы можете прокручивать список назад, используя for
, но мне тоже не нравится это решение.
Мне интересно: есть ли метод/расширения, который возвращает IEnumerable из текущего списка, что-то вроде плавающей копии? LINQ имеет множество методов расширения, которые делают именно это, но вам всегда нужно что-то делать с ним, например, с фильтрацией (где, принимать...).
Я с нетерпением жду чего-то вроде этого:
foreach(string item in myListOfStrings.Shadow()) {
myListOfStrings.Remove(item);
}
где as.Shadow():
public static IEnumerable<T> Shadow<T>(this IEnumerable<T> source) {
return new IEnumerable<T>(source);
// or return source.Copy()
// or return source.TakeAll();
}
Пример
foreach(ResponseFlags flag in responseFlagsList.Shadow()) {
switch(flag) {
case ResponseFlags.Case1:
...
case ResponseFlags.Case2:
...
}
...
this.InvokeSomeVoidEvent(flag)
responseFlagsList.Remove(flag);
}
Решение
Вот как я решил это, и он работает как шарм:
public static IEnumerable<T> Shadow<T>(this IEnumerable<T> source) where T: new() {
foreach(T item in source)
yield return item;
}
Это не очень быстро (очевидно), но это безопасно и точно, что я намеревался сделать.