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

本文关键字:循环 foreach 集合 修改 迭代器 自定义 实现 | 更新日期: 2023-09-27 18:15:05

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

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

您需要在类中有一个版本ID。在进入Add时将其递增。当您创建迭代器(在GetEnumerator()调用中(时,您会记住版本号——在每次迭代中,您都会检查版本号是否仍然是最初的版本号,否则就会抛出错误。

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

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