【问题标题】:Removing previous List<> item in an enumerator C#删除枚举器 C# 中的前一个 List<> 项
【发布时间】:2015-04-13 21:04:08
【问题描述】:
///main
while(true)
{
    List<string>.Enumerator instEnum = messagesList.GetEnumerator();
    InstantaiteObject(instEnum);
}

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

我需要删除我刚刚在该枚举器内循环的每个步骤中使用的项目。 如果在枚举器中无法执行,我需要从 main 中的所述列表中删除我使用的所有项目。 有内置的优雅方式吗?

【问题讨论】:

  • 你移除元素的条件是什么?

标签: c# list erase enumerator


【解决方案1】:

在通过接口迭代 IEnumerable 时更改其源会使 Enumerator 无效。因此,这不是直接可能的。 话虽如此,由于您使用的是List&lt;&gt;

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

  2. 改用索引器。

1 的示例:

foreach(var myItem in messageList.ToList())
{
    //Do stuff...

    if(whateverContition == true)
    {
        messageList.Remove(myItem);
    }
}

示例 2:

for(int i = 0; i < messageList.Count; i++)
{
    string myItem = messageList[i];

    //Do stuff...

    if(whateverContition == true)
    {
        messageList.RemoveAt(i);
        --i;
    }
}

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2022-01-23
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多