C# 删除以前的列表<&燃气轮机;枚举数C中的项# ///main while(true) { List.Enumerator instEnum=messagesList.GetEnumerator(); InstantaiteObject(instEnum); } ///统计员 while(枚举数.MoveNext()) { ..... }

C# 删除以前的列表<&燃气轮机;枚举数C中的项# ///main while(true) { List.Enumerator instEnum=messagesList.GetEnumerator(); InstantaiteObject(instEnum); } ///统计员 while(枚举数.MoveNext()) { ..... },c#,list,erase,enumerator,C#,List,Erase,Enumerator,我需要删除一个项目,我刚刚处理了枚举器中循环的每个步骤。 如果无法在枚举器中执行,我需要从main中的列表中删除所有我处理过的项目。 是否有一种内置的优雅方式可以做到这一点?您没有添加必要的细节。你可以使用很多可能的方法。例如,如果可以复制列表,请处理第一个元素,然后删除第一个元素: ///main while(true) { List<string>.Enumerator instEnum = messagesList.GetEnumerator(); Instan

我需要删除一个项目,我刚刚处理了枚举器中循环的每个步骤。 如果无法在枚举器中执行,我需要从main中的列表中删除所有我处理过的项目。
是否有一种内置的优雅方式可以做到这一点?

您没有添加必要的细节。你可以使用很多可能的方法。例如,如果可以复制列表,请处理第一个元素,然后删除第一个元素:

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

///enumerator
while (enumerator.MoveNext())
{
.....
}
var instEnum=新列表(messagesList);
而(instEnum.Count>0)
{
//过程项
// ...
//然后移除它
仪器计数移除(0);
}

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

在通过接口迭代时更改
IEnumerable
的源会使
枚举器无效。因此,这是不可能的。
也就是说,由于您使用的是
列表

  • 您可以迭代列表的副本,并从原始列表中删除需要删除的项(通常效率低下)。这不会使您的枚举数无效

  • 改用索引器

  • 示例1:

    var instEnum = new List<string>(messagesList);
    while (instEnum.Count > 0)
    {
        // Process item
        // ...
        // then remove it
        instEnum.RemoveAt(0);
    }
    
    示例2:

    foreach(var myItem in messageList.ToList())
    {
        //Do stuff...
    
        if(whateverContition == true)
        {
            messageList.Remove(myItem);
        }
    }
    
    for(int i=0;i

    如果您只能访问
    IEnumerable
    ,则可以执行#1或Ryan的解决方案。

    删除元素的条件是什么?
    for(int i = 0; i < messageList.Count; i++)
    {
        string myItem = messageList[i];
    
        //Do stuff...
    
        if(whateverContition == true)
        {
            messageList.RemoveAt(i);
            --i;
        }
    }