FC2ブログ
06 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.» 08

ハルシオンシステムの気ままBlog

株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

 

【ハルシオンブログ】Foreachで回している元の配列等の要素を消したかったけどエラーがでたので、こうしたよ。 

こんにちは!坂内っす。

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)

tb 0 : cm 0   

コメント

コメントの投稿

Secret

トラックバック

トラックバックURL
→http://halcyonsystemblog.jp/tb.php/676-c662f0fd
この記事にトラックバックする(FC2ブログユーザー)