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

时间:2011-11-16 15:19:29

标签: c# foreach iterator invalidoperationexception

我创建了一个实现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 个答案:

答案 0 :(得分:5)

您需要在班级中拥有版本ID。在进入Add时增加它。当您创建一个迭代器(在GetEnumerator()调用中)时,您会记住版本号 - 并且在每次迭代时,您将检查版本号是否仍然是它的开头,否则抛出。

答案 1 :(得分:4)

您可以在集合中添加一个字段,每次修改集合时都可以增加该字段。创建枚举数时,将该字段的值存储在枚举器中。使用枚举器时,验证字段的当前值是否与创建枚举数时存储的值相同。如果不是,你抛出一个InvalidOperationException

答案 2 :(得分:1)

您可以在代码中使用列表而不是临时数组,并且默认情况下会抛出InvalidOperationException。其次,你可以使用IEnumerable的通用版本,你可能不需要做创建自定义迭代器的艰苦工作。