【问题标题】: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<>
,因此有几种解决方法
您可以遍历列表的副本并从原始列表中删除需要删除的项目(通常效率低下)。这不会使您的枚举器无效
改用索引器。
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);
}
这有很多变体(使用索引,以便您可以跳过项目、删除项目等),因此在不了解您的情况的情况下,我们无法提供更多帮助。