gpt4 book ai didi

c# - foreach 循环是否正确处理列表长度的变化?

转载 作者:太空宇宙 更新时间:2023-11-03 17:40:14 25 4
gpt4 key购买 nike

foreach 是否正确迭代灵活列表?

例如

//will iterate over all items in list?
foreach (var obj in list)
{
//list length changes here
//ex:

list.Add(...);
list.Remove(...);
list.Concat(...);
// and so on
}

如果是这样……怎么办?

最佳答案

在 foreach 语句中枚举集合时,您不能修改它。

你应该使用另一种模式来做你想做的事情,因为 for each 不允许你改变你正在循环的枚举器。

例如:想象一下,如果您从头开始对排序列表运行 foreach,您开始处理 key="A"的项目,然后转到“B”,然后将“C”更改为“B”,将会发生什么?您的列表已重新排序,您不再知道循环的内容和位置。

一般来说,您“可以”使用 for(int i=dictionary.count-1; i>=0; --i) 来完成它或类似的东西,但这也取决于您的上下文,我真的会尝试使用另一种方法。

内部工作: IEnumerator<t>旨在启用迭代器模式来迭代元素集合,而不是长度索引。 IEnumerator<t>包括两名成员。

  • 第一个是 bool MoveNext() .使用此方法,我们可以从集合中的一个元素移动到下一个元素,同时使用 bool 返回检测我们何时枚举完每个项目。

  • 第二个成员,一个名为 Current 的只读属性, 返回当前正在处理的元素。有了集合类中的这两个成员,就可以简单地使用 while 循环遍历集合。

MoveNext()此 list 中的方法返回 false当它移过集合的末尾时。这取代了在循环时计算元素的需要。 (IEnumerator<t> 上的最后一个成员,Reset() 将重置枚举。)

关于c# - foreach 循环是否正确处理列表长度的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29586076/

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