有些语言在一个很典型的for或foreach循环中就可以删除集合中的元素,但是c#不可以,可以参考下面的方式:
C#循环删除集合中的元素
不能够在for中++,未删除时++,删除后不要++字典的话拷贝了一个键的List
private void test()
{
List<string> keys = new List<string>(_soundDic.Keys);
foreach (string key in keys)
{
List<AudioSource> audioList = _soundDic[key];
for (int i = 0; i < audioList.Count; )
{
if (audioList[i] == null || audioList[i].isPlaying == false)
{
audioList.RemoveAt(i);
}
else
{
i++;
}
}
if (audioList.Count == 0)
{
_soundDic.Remove(key);
}
}
keys = null;
}
于是问题解决了。是不是很高兴,但千万别高兴太早了哇嘎嘎,
我要指出上面程序中的几大问题
1.避免使用foreach循环,因为每次迭代都会产生24字节的垃圾内存,我想我们不想产生这些垃圾。
2.避免直接操作这个List,而是new一个新的List,把不要删除的数据存入新的List中,最后把新的List赋值给老List集合
原因,试想下,如果删除集合中的一个元素,那么后续的元素都要改变在内存中的位置,产生一定的开销。
如果能理解到这两点,我们可以算一个懂得“节俭”的程序员,哇嘎嘎,能省就省吧!