gpt4 book ai didi

.net - 如果原始集合修改了 .NET,枚举器会发生什么

转载 作者:行者123 更新时间:2023-12-04 06:24:40 25 4
gpt4 key购买 nike

我有一个通用的 Tree 类,它将实现 ICollection (因此也实现了 IEnumerable 和 IEnumerable)。

为此,我必须实现一个 TreeEnumerator 类。

每次调用 Tree.GetEnumerator() 都将返回一个新的 TreeEnumerator 实例。

我有两个问题:

  • 如果周围漂浮着许多 TreeEnumerator 对象并且底层 Tree 发生变化,那么会发生什么?如何处理?
  • 创建 TreeEnumerator 时对所有树元素(在 TreeEnumerator 内以便于数组遍历)进行 CopyToArray 还是对每个 MoveNext 一次进行一次遍历更好?

  • 我知道 CopyToArray 很容易进行一次遍历,但会占用空间。

    编辑 :

    了解版 native 制后:

    你能指出这个版本控制机制的示例代码吗?必须有标准的命名和访问方式,因为 foreach 循环将需要对每个 MoveNext 进行此检查

    最佳答案

    通常,对基础集合的结构更改会使任何现有迭代器失效。这可以使用集合中的“版本号”来实现,可以在每个迭代步骤中进行检查。

    例如,来自 List<T>.GetEnumerator() 的文档:

    An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying, or deleting elements, the enumerator is irrecoverably invalidated and its behavior is undefined.



    (实际上,它会抛出 InvalidOperationException 。)

    请注意,.NET 4 中的并发集合明确允许在不使迭代器无效的情况下更改集合。通常迭代器只会看到原始元素,就像在 GetEnumerator() 时拍摄了快照一样。被称为。

    关于.net - 如果原始集合修改了 .NET,枚举器会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6173713/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com