我创建了一个实现 IEnumerable(T) 和自定义 IEnumerator(T) 的自定义集合。
我还在自定义集合中添加了一个 Add() 方法,如下所示:
public void Add(T item)
{
T[] tempArray = new T[_array.Length + 1];
for (int i = 0; i < _array.Length; i++)
{
tempArray[i] = _array[i];
}
tempArray[_array.Length] = item;
_array = tempArray;
tempArray = null;
}
该实现基于此示例 http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx 。
当我对数组执行 foreach 循环时,我想防止集合修改(例如在循环内调用 Add())并抛出一个新的 InvalidOperationException。我怎么能做到这一点?
最佳答案
你需要在你的类(class)中有一个版本 ID。在进入 Add
时增加它。当你创建一个迭代器(在 GetEnumerator()
调用中)你会记住版本号 - 在每次迭代时,你会检查版本号是否仍然是它开始时的版本号,否则抛出。
关于C# 自定义迭代器实现 - 防止在 foreach 循环期间修改集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8154012/