C#中在foreach循环中插入List

5

我有以下循环:

List<Reminders> reminds = new List<Reminders>();
//...
foreach (Reminders remind in reminds)
{
    //....
    reminds.Insert(id, new Reminders() { Title = remind.Title, Content = remind.Content, Checked = true });
}

然而,在foreach循环中出现了一个错误。
foreach (Reminders remind in reminds)

如果我删除reminds.Insert语句,就不会再出现错误。我正在尝试更新foreach循环内部的一些条目。是什么导致了这个错误?

你遇到了哪个错误? - John Saunders
你不能在使用“foreach”迭代集合时修改它,你到底想做什么? - Habib
请查看此链接:https://dev59.com/k3RA5IYBdhLWcg3w_C8w - Michael B
1
你应该使用for()循环而不是foreach... - Luca Perotti
2
首先让我们了解您想要做什么,是更新集合中的某些内容还是插入新项目到集合中。 - mybirthname
显示剩余3条评论
4个回答

5

将您的代码更改为以下内容:

List<Reminders> reminds = new List<Reminders>();
...
foreach (Reminders remind in reminds.ToList())
{
    ....
    reminds.Insert(id, new Reminders() { Title = remind.Title, Content = remind.Content, Checked = true });
}

请注意在reminds后面的.ToList()。
解释:在foreach循环遍历集合时,不允许修改该集合。使用.ToList()会创建另一个临时集合,该集合在foreach循环中是固定的。

虽然这可能会对内存和性能产生影响,但如果您对列表大小有合理的想法,那么这是相当聪明的。不确定初级程序员是否能看到其中的细微差别。 - Pale Ale

3

没错,你正在同一个列表中迭代。你需要创建一个临时列表,并在循环中将元素添加到该临时列表中。之后,在foreach循环结束后,你需要使用AddRange方法:

reminds.AddRange(tempList);

1
如果您想更新某些条目,则不应添加新条目,只需将每个条目的属性Checked设置为true即可:
List<Reminders> reminds = new List<Reminders>();
...
foreach (Reminders remind in reminds)
{
    ....
    remind.Checked = true;
}

你必须不修改正在迭代的列表。

谢谢!我没想到那么简单。 - GoOx

0
不可以在迭代过程中插入元素,否则结果会出错。你需要创建一个临时列表,在追加完元素后再使用AddRange()方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接