C#对List同时遍历删除操作

之前遇到过一个问题。就是对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;
            } 
        }
    }
展开阅读全文

没有更多推荐了,返回首页