循环遍历列表并删除项目时,集合被修改错误

时间:2013-09-10 16:26:12

标签: c# asp.net .net

我有以下内容:

 tempLabID = lstLab;
                    foreach (string labID in lstLab)
                    {
                        if (fr.GetFileRecipients(fsID).Contains(labID))
                        {
                            tempLabID.Remove(labID);
                        }
                    }   

当我调试并观察lstLab并且我得到tempLabID.remove()时,它将lstLab从1更改为0,然后当它返回到foreach时,我得到一个错误,说明该集合已被修改。< / p>

我无法理解为什么会这样。我正在修改另一个系列。

6 个答案:

答案 0 :(得分:5)

不,您正在修改同一个集合。您有两个指向同一集合的变量。您的第一行需要克隆该集合才能生效。

您可以修改代码,以免出现此问题:

lstLab.RemoveAll( labID => fr.GetFileRecipients(fsID).Contains(labID) );

这将删除所有要删除的内容,而无需循环或临时副本。

答案 1 :(得分:1)

你不能这样做。

更改

tempLabID = lstlab;

tempLabID = lstLab.ToList();

答案 2 :(得分:1)

由于tempLabIDlstLab都指向同一个集合,因此您不会修改其他集合。

尝试:

tempLabID = lstLab.ToList();

答案 3 :(得分:0)

您正在修改同一个集合,因为tempLabID = lstLab将引用(指针)复制到集合,但它不会克隆集合。

您可能想要克隆集合:

tempLabID = lstLab.ToArray();

答案 4 :(得分:0)

这将解决您的问题:

tempLabID = lstLab.Where(l => fr.GetFileRecipients(fsID).Contains(l)).ToList();

有关详细说明,请阅读Jon Skeets answer

答案 5 :(得分:0)

在这种情况下,我通常只是向后遍历列表。 (不是很花哨,但它有效。)

    for (int x = lstLab.Count - 1; x >= 0; x--)
    {
        string labId = lstLab[x];
        if (fr.GetFileRecipients(fsID).Contains(labID))        
           lstLab.RemoveAt(x);        
    }