我创建了一个实现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。我怎么能这样做?
答案 0 :(得分:5)
您需要在班级中拥有版本ID。在进入Add
时增加它。当您创建一个迭代器(在GetEnumerator()
调用中)时,您会记住版本号 - 并且在每次迭代时,您将检查版本号是否仍然是它的开头,否则抛出。
答案 1 :(得分:4)
您可以在集合中添加一个字段,每次修改集合时都可以增加该字段。创建枚举数时,将该字段的值存储在枚举器中。使用枚举器时,验证字段的当前值是否与创建枚举数时存储的值相同。如果不是,你抛出一个InvalidOperationException
。
答案 2 :(得分:1)
您可以在代码中使用列表而不是临时数组,并且默认情况下会抛出InvalidOperationException。其次,你可以使用IEnumerable的通用版本,你可能不需要做创建自定义迭代器的艰苦工作。