C#自定义迭代器实现 - 在foreach循环期间防止集合修改

3
我创建了一个实现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异常。我该怎么做?
3个回答

6

在你的类中,需要有一个版本ID。在进入Add时递增它。当你创建迭代器(在GetEnumerator()调用中)时,你会记住版本号,并在每次迭代时检查版本号是否仍然与开始时相同,否则就会抛出异常。


谢谢Jon。一个非常简单的解决方案。现在看起来似乎很明显。=) - Marko

4

您可以向集合中添加一个字段,每次修改集合时都可以对其进行递增。创建枚举器时,将此字段的值存储在枚举器中。使用枚举器时,请验证字段的当前值是否与创建枚举器时存储的值相同。如果不同,则会抛出 InvalidOperationException 异常。


1
你可以在代码中使用列表而不是临时数组,这样默认情况下会抛出InvalidOperationException异常。其次,你可以使用IEnumerable的泛型版本来完成,这样就不必费力地创建自定义迭代器了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接