无法从每个循环C#中的列表中删除列表项

时间:2014-04-26 09:45:28

标签: c# asp.net .net

我有一个名为_interestlist的自定义对象列表。现在我想删除此列表中“active”成员设置为false的所有项目。我写了一些像这样的东西

      int counter = 0;
        foreach (var interest in _interestlist)
        {
            if (interest.active==false)
            {
                _interestlist.Remove(interest);
            }
            counter++;
        }

但这会引发像这样的错误

Collection was modified; enumeration operation may not execute.

这个操作不能通过循环吗?有没有其他方法可以达到这个目的?

6 个答案:

答案 0 :(得分:3)

如上所述,foreach循环使用枚举器枚举列表,迭代时无法对其进行修改。

您可以改用LINQ:

var count  = _interestList.RemoveAll(x => x.active == false);

其中count是删除的元素数。

答案 1 :(得分:2)

这是因为foreach使用了GetEnumerator功能。该枚举器将在更改(添加,删除等)集合时失效。

根据建议,请改用for

答案 2 :(得分:1)

您无法修改您在foreach循环中迭代的集合,请改用for

for (int counter = _interestlist.Count - 1; i >= 0; counter--)
{
    if (!interest[counter].active)
    {
        _interestlist.Remove(interest[counter]);
    }
}

另外,您不应该像这样检查bool字段:

if (!interest.active)

答案 3 :(得分:1)

标准方法是跟踪要删除的项目(例如,在另一个列表中),然后在枚举项目后,枚举removelist,从项目中删除每个项目。

答案 4 :(得分:1)

使用foreach语句迭代列表看起来像

IEnumerator enumerator = list.GetEnumerator();

while ( enumerator.MoveNext() )
{
    Console.WriteLine( enumerator.Current );
}

您可以观察到在迭代之前使用了相同的对象,这就是为什么你不能解决的问题 修改foreach语句中的迭代列表元素

答案 5 :(得分:0)

您无法修改枚举数,因为它们只读

来自MSDN:GetEnumerator()

  

枚举器可用于读取集合中的数据,但它们   不能用于修改底层集合。

解决方案:一种解决方案是将项目从最后一个迭代到第一个,以删除所需的项目。

试试这个:

for (int i= _interestlist.Count-1; i >= 0 ;i--)
{
    if (_interestlist[i].active == false)
    {
        _interestlist.Remove(_interestlist[i]);
    }       
}