首先,我知道由于显而易见的原因,这不可能开箱即用。
foreach(string item in myListOfStrings) {
myListOfStrings.Remove(item);
}
上面的片段是我见过的最可怕的事情之一。那么,你如何实现它呢?您可以使用 向后遍历列表for
,但我也不喜欢这种解决方案。
我想知道的是:是否有从当前列表返回 IEnumerable 的方法/扩展,类似于浮动副本?LINQ 有许多扩展方法可以做到这一点,但你总是需要对它做一些事情,比如过滤(where, take...)。
我很期待这样的事情:
foreach(string item in myListOfStrings.Shadow()) {
myListOfStrings.Remove(item);
}
其中 .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;
}
它不是那么快(显然),但它是安全的并且正是我打算做的。