gpt4 book ai didi

c# - System.Collections.IEnumerator 对象的意外行为

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

我想删除集合中的所有元素,但由于我没有看到 .RemoveAll 之类的东西,所以我使用了下面的代码。

int number = addressBook.Items.Count;
System.Collections.IEnumerator enumerator = ...
while (enumerator.MoveNext())
{
target = enumerator.Current as Outlook.ContactItem;
target.Delete();
}

但是,我注意到每次运行程序时,集合中剩余元素的数量大约是一半。我的结论是 .Delete() 自己跳到下一个元素,这意味着循环条件中的 .MoveNext() 跳转到 之后的元素下一个。

所以我尝试按如下方式重置枚举器。

int number = addressBook.Items.Count;
System.Collections.IEnumerator enumerator = ...
while (enumerator.MoveNext())
{
target = enumerator.Current as Outlook.ContactItem;
target.Delete();
enumerator.Reset();
}

但是,当我检查 .Count 时,我发现在删除最后一个元素并重置枚举器之后,剩余的元素数仍然是 1。当然,我遇到了异常。

我在这张照片中遗漏了什么?我知道这不是错误,因为那个很久以前就会被报告和解决...

最佳答案

IEnumerator 只能在基础集合保持不变的情况下使用。一旦它发生变化(例如,通过从中删除元素),枚举器将不可恢复地失效。

您不能在修改集合时使用一个枚举器来浏览它,而 Reset 对此无济于事。您只需要每次都创建一个新的枚举器。例如。类似的东西可能会起作用:

while (addressBook.Items.Count > 0)
{
foreach(Outlook.ContactItem target in ...)
{
target.Delete();
break; // <-- !
}
}

关于c# - System.Collections.IEnumerator 对象的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12318361/

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