有什么办法可以在此foreach循环中修改集合?

时间:2019-07-08 17:45:27

标签: c#

在foreach循环中抛出一个错误,该集合被修改。

考虑到在foreach循环中唯一发生的事情是一个方法,我在其中传递了一个字符串。我找不到一种方法可以在循环期间更改集合“卡片”,而不管方法内部发生了什么。

我想知道你们中是否有人对ExcludeCard方法有一个定义,该定义可能会更改卡的集合。

在其他人发表了很好的评论之后,我想补充一下,该方法是由另一个类调用的。 Lack方法无法重新引用调用它的类。

public void Lack(List<string> cards, int playerIndex)
{
    foreach (string card in cards)
    {
        ExcludeCard(card, playerIndex);
    }
}

1 个答案:

答案 0 :(得分:1)

如果您的ExcludeCard实现修改了传递给Lack方法的集合,则可能导致此错误的发生。这是因为List<T>是通过引用传递的,因此您将对当前正在枚举的集合执行操作。

以下将导致问题:

void Main()
{
    Lack(Cards, 0);
}

public List<string> Cards = Enumerable.Range(0,10).Select(x => x.ToString()).ToList();

public void Lack(List<string> cards, int playerIndex)
{
    foreach (string card in cards)
    {
        ExcludeCard(card, playerIndex);
    }
}

public void ExcludeCard(string card, int playerIndex) 
{
    Cards.Remove(card);
}