我有以下内容:
tempLabID = lstLab;
foreach (string labID in lstLab)
{
if (fr.GetFileRecipients(fsID).Contains(labID))
{
tempLabID.Remove(labID);
}
}
当我调试并观察lstLab并且我得到tempLabID.remove()时,它将lstLab从1更改为0,然后当它返回到foreach时,我得到一个错误,说明该集合已被修改。< / p>
我无法理解为什么会这样。我正在修改另一个系列。
答案 0 :(得分:5)
不,您正在修改同一个集合。您有两个指向同一集合的变量。您的第一行需要克隆该集合才能生效。
您可以修改代码,以免出现此问题:
lstLab.RemoveAll( labID => fr.GetFileRecipients(fsID).Contains(labID) );
这将删除所有要删除的内容,而无需循环或临时副本。
答案 1 :(得分:1)
更改
tempLabID = lstlab;
到
tempLabID = lstLab.ToList();
答案 2 :(得分:1)
由于tempLabID
和lstLab
都指向同一个集合,因此您不会修改其他集合。
尝试:
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);
}