枚举时防止修改集合

时间:2014-05-30 09:10:32

标签: c# collections enumeration

如何防止在枚举期间修改Collection。

这是类源代码。

 public class cars : IEnumerator,IEnumerable
 {
  private car[] carlist;
  int position = -1;

  public IEnumerator GetEnumerator()
  { return (IEnumerator)this; }

  public bool MoveNext()
  {
     position++;
     return (position < carlist.Length);
  }

  public void Reset()
  {position = 0;}

  //IEnumerable
  public object Current
  { get { return carlist[position];}
  }
 }      

2 个答案:

答案 0 :(得分:1)

首先,您的集合类不应该实现IEnumerator - 它应该只实现IEnumerable并返回另一个实现IEnumerator的类的实例(可能是carEnumerator){ {1}}被调用。

GetEnumerator()(在IEnumerator中实施)扩展carEnumerator因此,在IDisposable中,您可以将私有标记(可能cars.GetEnumerator())设置为true。在private bool isEnumerating中,保留对集合(汽车)的引用,并在carEnumerator中将carEnumerator.Dispose()设置为false。

最后,在枚举正在进行时要禁用的汽车中的所有方法中,检查isEnumerating的状态并抛出异常或如果是真的则不执行任何操作。

答案 1 :(得分:0)

至少有一些BCL系列通过包含版本计数器来完成此操作。集合的每次修改都会使计数器递增。当开始集合的枚举时,保留版本计数的当前值。在每次调用枚举器MoveNext时,如果抛出不同的异常,则会根据保留的计数器检查基础集合的版本。

相关问题