我有循环:
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
int listCount = list.Count;
for (int i = 0; i < listCount; i++) // Loop through List with for
{
if (i == 2)
{
list.Add(666);
listCount++;
}
System.Diagnostics.Debug.Write(list[i]);
}
我想知道如何将相同的逻辑应用于 foreach 循环? (在 foreach 循环中添加更多元素)。
这样的事情:
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
foreach (int i in list)
{
if (i == 2)
{
list.Add(666);
//do something to refresh the foreach loop
}
System.Diagnostics.Debug.Write(list[i]);
}
答案 0 :(得分:4)
我想知道如何将相同的逻辑应用于foreach循环?
你不应该而且你不能。 在foreach
循环内无法修改。
请参阅:foreach, in (C# Reference)
如果您需要在源集合中添加或删除项目,请使用 for loop。
一种方法是制作List的副本,然后处理原始列表,如:
foreach (int i in list.ToList())
{
if (i == 2)
{
list.Add(666);
//do something to refresh the foreach loop
}
System.Diagnostics.Debug.Write(list[i]);
}
list.ToList
将复制列表,foreach
循环将对其起作用,从而使您免于异常。但这更像是 hack ,因为您没有在foreach
循环中迭代原始列表。
答案 1 :(得分:1)
你不能。 foreach
循环取决于IEnumerable
的行为,结果是在项的迭代期间无法修改集合。每次尝试对集合执行这些类型的修改时,都会收到运行时异常。
答案 2 :(得分:1)
您可以自己编写一个自定义枚举器或集合,允许您在枚举时修改集合。另一方面,你可能应该完全做其他事情。
我不确定你要做什么,但对我来说这看起来好多了:
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
var outputList = new List<int>();
foreach (int i in list)
{
if (i == 2)
{
outputList.Add(666);
//do something to refresh the foreach loop
}
outputList.Add(list[i]);
}
只需创建一个新的清单。尽量不要改变数据结构。那很脆弱。通常最好从旧数据创建新数据。
答案 3 :(得分:1)
不完全是你想要做的,但你可以做这样的事情......
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
List<int> list2 = new List<int>();
list2 = list;
foreach (int i in list)
{
if (i == 2)
{
list2.Add(666);
}
System.Diagnostics.Debug.Write(list[i]);
i++; // increment i
}
list = list2;
答案 4 :(得分:1)
如果您正在寻找 consize解决方案,您可以使用 Linq 而不是 for loop 或 foreach循环(无法在 foreach 循环中更改集合):
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
// add required "666" items
list.AddRange(Enumerable.Repeat(666, list.Count(x => x == 2)));
// print out all items
foreach(item in list)
System.Diagnostics.Debug.Write(item);
答案 5 :(得分:0)
是和否,已经给出了2个答案。
有一种方法可以在foreach循环中修改集合(实际列出),使用以下语法,来自LINQ:
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.ForEach(elt => {
if(elt == 2) {
list.Add(666);
}
System.Diagnostics.Debug.Write(elt);
});
但要小心......如果你在条件中将“2”添加到你的列表中,你就会变得无限:)