删除上一个列表<>枚举器C#中的项

时间:2015-04-13 21:04:09

标签: c# list erase enumerator

///main
while(true)
{
    List<string>.Enumerator instEnum = messagesList.GetEnumerator();
    InstantaiteObject(instEnum);
}

///enumerator
while (enumerator.MoveNext())
{
.....
}

我需要删除一个我刚刚在enumeratror中循环的每一步工作的项目。 如果在枚举器中无法做到,我需要从main里面的所有List中删除我使用过的所有项目。  是否有内置的优雅方式?

2 个答案:

答案 0 :(得分:1)

在通过界面迭代IEnumerable时更改Enumerator的来源会使List<>无效。因此,它不可能直接实现。 这就是说,因为您正在使用foreach(var myItem in messageList.ToList()) { //Do stuff... if(whateverContition == true) { messageList.Remove(myItem); } }

,所以有几种解决方法
  1. 您可以遍历列表的副本并删除需要从原始列表中删除的项目(通常效率低下)。这不会使您的枚举器无效

  2. 请改用索引器。

  3. 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);
}

这有很多变化(使用索引,因此您可以跳过项目,删除项目等),因此在不了解您的情况的情况下,我们无法提供更多帮助。