之前遇到过一个问题。就是对List同时遍历和删除操作出现遍历对象遗漏或者数据越界问题。卡卡西,卡神给的建议让下面正确方法的代码变的更牛逼。
1,这种方法会导致list遍历遗漏对象。
private void test()
{
for(int i=0;i<lists.Count;i++)
{
//如果我在里面有直接lists.Remove(object);
//这时候就会出问题。比如最开始lists大小为10,中间有删掉,再次判断的时候就成了9,循环,这样会导致遗漏了很多多像
}
//这个方法几乎每次都是获取lists的真实大小。当i=0,然后删掉。i++了,i=1了,索引的对象就成了i+1,就是说前面的对象一直没处理到,导致遗漏了很多对象。
}
2,这中方法会导致List遍历过程中数组越界。
private void test2()
{
int num = lists.Count;
for(int i=0;i<num;i++)
{
//如果我在里面有直接lists.Remove(object);
//这时候就会出问题。会出现数组越界的情况
}
//这种方法我的理解是这样的。当i=0的时候进入循环体逻辑,然后删除索引0的值。虽然最初的大小没有改变,但是实际上lists里面的大小已经改变,所以会报数组越界的错误。
}
经过多种测试和分析问题,得出了正确的解决方法,代码如下:
/// <summary>
/// 当你在遍历的过程中删除某个对象的时候,这时被删除的对象之后的所有对象都会往前移动一位。
/// 如果想正确的遍历整个list就需要让i从0开始重新遍历。
/// 我这里的i=-1是因为当我们进行下一次循环的时候i++,所有刚好下次循环的时候是用0开始。
/// 缺点:因为每次删除对象都嘚从新遍历,所有增加了代码执行的时间。
/// </summary>
private void Test()
{
for(int i=lists.Count-1;i>=0;i--)
{
if(lists[i]==1)
{
lists.Remove(lists[i]);
break;
}
}
}