在c#中使用foreach循环时修改Collection
问题内容:
这个问题已经在这里有了答案 :
在“ foreach”循环中修改列表的最佳方法是什么? (11个答案)
7年前关闭。
基本上,我想在foreach循环中从列表中删除一个项目。我知道在使用for循环时这是可能的,但是出于其他目的,我想知道使用foreach循环是否可以实现。
在python中,我们可以通过执行以下操作来实现:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in a:
print i
if i == 1:
a.pop(1)
这给出了以下输出
>>>1
3
4
5
6
7
8
9
但是当在c#中执行类似的操作时,我得到了InvalidOperationException,我想知道是否有一种解决方法, 而不仅仅是使用for循环
。
抛出异常时我使用的c#代码:
static void Main(string[] args)
{
List<string> MyList = new List<string>(new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9"});
foreach (string Item in MyList)
{
if (MyList.IndexOf(Item) == 0)
{
MyList.RemoveAt(1);
}
Console.WriteLine(Item);
}
}
提前致谢
问题答案:
你做不到 从文档中获取IEnumerator<T>
:
只要集合保持不变,枚举数将保持有效。如果对集合进行了更改(例如添加,修改或删除元素),则枚举数将无法恢复,并且其行为是不确定的。
替代方法是:
- 建立要删除的新项目列表,然后将其全部删除
- 使用普通的“ for”循环,并确保不要将同一元素重复两次或遗漏任何内容,请务必小心。(您说过您不想这样做,但是您尝试执行的操作将不起作用。)
- 建立一个仅包含您要保留的元素的新集合
这些选择的最后一个是类似LINQ的解决方案,您通常在其中编写:
var newList = oldList.Where(x => ShouldBeRetained(x)).ToList();
(ShouldBeRetained
当然,您希望使用什么逻辑。)ToList()
仅当您实际需要列表时才需要调用。这导致了更具说明性的代码,通常更易于阅读。我无法轻易地猜出您的原始循环是要做什么的(此刻似乎很奇怪),而如果您可以仅根据项目来表达逻辑,则可以更加清楚。