///main
while(true)
{
List<string>.Enumerator instEnum = messagesList.GetEnumerator();
InstantaiteObject(instEnum);
}
///enumerator
while (enumerator.MoveNext())
{
.....
}
我需要删除一个我刚刚在enumeratror中循环的每一步工作的项目。 如果在枚举器中无法做到,我需要从main里面的所有List中删除我使用过的所有项目。 是否有内置的优雅方式?
答案 0 :(得分:1)
在通过界面迭代IEnumerable
时更改Enumerator
的来源会使List<>
无效。因此,它不可能直接实现。
这就是说,因为您正在使用foreach(var myItem in messageList.ToList())
{
//Do stuff...
if(whateverContition == true)
{
messageList.Remove(myItem);
}
}
您可以遍历列表的副本并删除需要从原始列表中删除的项目(通常效率低下)。这不会使您的枚举器无效
请改用索引器。
1的示例:
for(int i = 0; i < messageList.Count; i++)
{
string myItem = messageList[i];
//Do stuff...
if(whateverContition == true)
{
messageList.RemoveAt(i);
--i;
}
}
2的例子:
IEnumerable
如果您只能访问{{1}},则可以执行#1或瑞恩的解决方案。
答案 1 :(得分:0)
您尚未添加必要的详细信息。您可以使用许多可能的方法。例如,如果您可以复制列表,则处理第一个元素,然后删除第一个元素:
var instEnum = new List<string>(messagesList);
while (instEnum.Count > 0)
{
// Process item
// ...
// then remove it
instEnum.RemoveAt(0);
}
这有很多变化(使用索引,因此您可以跳过项目,删除项目等),因此在不了解您的情况的情况下,我们无法提供更多帮助。