如何防止在枚举期间修改Collection。
这是类源代码。
public class cars : IEnumerator,IEnumerable
{
private car[] carlist;
int position = -1;
public IEnumerator GetEnumerator()
{ return (IEnumerator)this; }
public bool MoveNext()
{
position++;
return (position < carlist.Length);
}
public void Reset()
{position = 0;}
//IEnumerable
public object Current
{ get { return carlist[position];}
}
}
答案 0 :(得分:1)
首先,您的集合类不应该实现IEnumerator
- 它应该只实现IEnumerable
并返回另一个实现IEnumerator
的类的实例(可能是carEnumerator
){ {1}}被调用。
GetEnumerator()
(在IEnumerator
中实施)扩展carEnumerator
因此,在IDisposable
中,您可以将私有标记(可能cars.GetEnumerator()
)设置为true。在private bool isEnumerating
中,保留对集合(汽车)的引用,并在carEnumerator
中将carEnumerator.Dispose()
设置为false。
最后,在枚举正在进行时要禁用的汽车中的所有方法中,检查isEnumerating
的状态并抛出异常或如果是真的则不执行任何操作。
答案 1 :(得分:0)
至少有一些BCL系列通过包含版本计数器来完成此操作。集合的每次修改都会使计数器递增。当开始集合的枚举时,保留版本计数的当前值。在每次调用枚举器MoveNext
时,如果抛出不同的异常,则会根据保留的计数器检查基础集合的版本。