【ハルシオンブログ】Foreachで回している元の配列等の要素を消したかったけどエラーがでたので、こうしたよ。
こんにちは!坂内っす。
UnityでListの中の特定の要素を消そうと思ったときに、エラーが出てしまう話。
こんなことをやろうとすると、以下のエラーがでてしまいます。
Foreachの処理中に大本のリスト等に変化が生じると出るエラーのようです。
そうですよね、foreachでarrayを回している最中にarrayの要素を消そうとしているんですから。
こんな時は一度違う変数に突っ込んでからやるといいらしいですよ。
これでちゃんと結果まで出ます。

こんな感じで一度別の変数に突っ込んでからやりましょう!
では、あでゅ~ノシ
UnityでListの中の特定の要素を消そうと思ったときに、エラーが出てしまう話。
public class Test0217 : MonoBehaviour
{
private void Start() {
List<int> array = new List<int>();
array.Add(1);
array.Add(2);
array.Add(3);
array.Add(4);
array.Add(5);
foreach(var intInAry in array) {
if(intInAry == 1 || intInAry == 3) {
array.Remove(intInAry);
}
}
for(int i = 0; i < array.Count; i++) {
Debug.Log(array[i]);
}
}
}
こんなことをやろうとすると、以下のエラーがでてしまいます。
InvalidOperationException: Collection was modified; enumeration operation may not execute.
System.ThrowHelper.ThrowInvalidOperationException (System.ExceptionResource resource) (at <1f0c1ef1ad524c38bbc5536809c46b48>:0)
System.Collections.Generic.List`1+Enumerator[T].MoveNextRare () (at <1f0c1ef1ad524c38bbc5536809c46b48>:0)
System.Collections.Generic.List`1+Enumerator[T].MoveNext () (at <1f0c1ef1ad524c38bbc5536809c46b48>:0)
Test0217.Start () (at Assets/Scripts/Test0217.cs:16)
Foreachの処理中に大本のリスト等に変化が生じると出るエラーのようです。
そうですよね、foreachでarrayを回している最中にarrayの要素を消そうとしているんですから。
こんな時は一度違う変数に突っ込んでからやるといいらしいですよ。
public class Test0217 : MonoBehaviour
{
private void Start() {
List<int> array = new List<int>();
array.Add(1);
array.Add(2);
array.Add(3);
array.Add(4);
array.Add(5);
// arrayBufferにarrayの中身をコピーしておく
List<int> arrayBuffer = new List<int>();
foreach(var intInAry in array) {
arrayBuffer.Add(intInAry);
}
foreach(var intInAry in arrayBuffer) {
if(intInAry == 1 || intInAry == 3) {
array.Remove(intInAry);
}
}
for(int i = 0; i < array.Count; i++) {
Debug.Log(array[i]);
}
}
}
これでちゃんと結果まで出ます。

こんな感じで一度別の変数に突っ込んでからやりましょう!
では、あでゅ~ノシ
Category: 開発日記(Unity)
« 【ハルシオンブログ】Linqの「Union」「Intersect」「Except」について | 【ハルシオンブログ】enumを拡張して色々使えるようにしまっしょい!(他人の記事紹介w) »
コメント
| h o m e |