有一个示例如何实现枚举器 migh :
http://msdn.microsoft.com/en-us/library/system.collections.ienumerator.aspx这是一种有效的方法。但是,真正的List
或Array
在修改它们时会使它们的迭代器失效。
我的问题是 - 它是如何完成的?
我能想到的最好的仍然是保留对集合的引用,还有一些标记(int id)。每次调整集合大小时,标记都会增加。在枚举器侧的每个moveNext
上,检查标记 - 当匹配时,枚举继续,否则 - 抛出异常。
但这只是我疯狂的猜测,我没有找到任何可靠的东西。
答案 0 :(得分:4)
怎么做?
微不足道的。保留一个版本计数器。将枚举数创建时的版本计数器与每个产量的枚举对象中的版本计数器进行比较。成品。显然:每次更改都要更改版本。
现在,"我没有找到任何可靠的东西" - 你有没有想过 - 啊 - 阅读源代码?这一切都是公开的,你知道......
http://referencesource.microsoft.com/
你找mscorlib。
例如,ArrayList:http://referencesource.microsoft.com/#mscorlib/system/collections/arraylist.cs
它没有比那更坚实。