我有一个名为_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.
这个操作不能通过循环吗?有没有其他方法可以达到这个目的?
答案 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]);
}
}