1

我有以下内容:

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

当我调试并观看 lstLab 并进入 tempLabID.remove() 时,它会将 lstLab 从 1 更改为 0,然后当它返回到 foreach 时,我收到一个错误,指出集合已被修改。

我不明白为什么会这样。我正在修改一个不同的集合。

4

6 回答 6

5

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

你可以修改你的代码,这样你就没有这个问题:

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

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

于 2013-09-10T16:28:08.623 回答
1

你不能那样做。

改变

tempLabID = lstlab;

tempLabID = lstLab.ToList();

于 2013-09-10T16:28:05.700 回答
1

您没有修改不同的集合,因为两者tempLabIDlstLab指向同一个集合。

尝试:

tempLabID = lstLab.ToList();
于 2013-09-10T16:28:14.183 回答
0

这将解决您的问题:

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

如需进一步解释,请阅读Jon Skeets 的回答

于 2013-09-10T16:36:33.317 回答
0

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

您可能想要克隆集合:

tempLabID = lstLab.ToArray();
于 2013-09-10T16:29:21.330 回答
0

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

    for (int x = lstLab.Count - 1; x >= 0; x--)
    {
        string labId = lstLab[x];
        if (fr.GetFileRecipients(fsID).Contains(labID))        
           lstLab.RemoveAt(x);        
    }
于 2013-09-10T17:54:49.320 回答