for, foreach循环内删除循环体元素探讨
foreach :
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
List<int> array = new List<int> { 1, 2, 3, 4 };
foreach (var item in array)
{
array.RemoveAt(0);
}
}
}
结果:
在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。增添元素同理也会报错。
for
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
List<int> array = new List<int> { 1, 2, 3, 4 };
for (int i = 0; i < array.Count; i++)
{
Debug.Log(array[i]);
}
Debug.Log("----删除前----");
for (int i = 0; i < array.Count; i++)
{
Debug.Log("array[0] : " + array[0]);
array.RemoveAt(0);
Debug.Log("第 " + (i+1) + " 次删除array数组长度" + array.Count);
}
Debug.Log("----删除后----");
for (int i = 0; i < array.Count; i++)
{
Debug.Log(array[i]);
}
}
}
结果:
由结果可见,通过for循环删除元素虽然不会报错,但容易造成误删乱删的情况,因为在删除元素时,array的长度不断变化,导致难以控制。
原理见 for循环流程图。
解决方案: 用一个临时的数组来暂时存储要删除的元素,然后通过遍历该临时数组的方式删除原数组想要删除的元素。