まず、明らかな理由により、これをすぐに使用できるわけではないことを私は知っています。
foreach(string item in myListOfStrings) {
myListOfStrings.Remove(item);
}
上で切り取られたものは、私が今まで見た中で最も恐ろしいものの 1 つです。それで、どうやってそれを達成しますか?を使用してリストを逆方向に繰り返すこともできますが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;
}
それほど高速ではありませんが (明らかに)、安全であり、まさに私が意図したとおりです。