C# 通过在循环中添加更多元素来扩展foreach循环
我有一个循环:C# 通过在循环中添加更多元素来扩展foreach循环,c#,loops,foreach,C#,Loops,Foreach,我有一个循环: List List=新列表(); 增加第(1)款; 增加(2); 增加(3); int listCount=list.Count; for(int i=0;i{ 如果(elt==2){ 增加(666); } 系统.诊断.调试.写入(elt); }); 但是要小心。。。如果在条件内将“2”添加到列表中,您将进入无限状态:)如果您正在寻找一致的解决方案,您可以使用Linq而不是for loop或foreach loop(您不能更改foreach loop中的集合): List Li
List List=新列表();
增加第(1)款;
增加(2);
增加(3);
int listCount=list.Count;
for(int i=0;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]);
}
List List=新列表();
增加第(1)款;
增加(2);
增加(3);
foreach(列表中的int i)
{
如果(i==2)
{
增加(666);
//执行一些操作来刷新foreach循环
}
系统.诊断.调试.写入(列表[i]);
}
我想知道如何将相同的逻辑应用于foreach循环
你不应该也不能集合不能在foreach
循环内修改
见:
如果需要从源集合中添加或删除项,请使用
循环
一种方法是复制列表,然后对原始列表进行处理,如:
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
循环将对其进行处理,从而将您从异常中解救出来。但这更像是一种黑客行为,因为您不是在foreach
循环中迭代原始列表 你不能。foreach
循环取决于IEnumerable
的行为,其结果是在项的迭代过程中无法修改集合。每次尝试对集合执行这些类型的修改时,都会出现运行时异常。您可以编写一个自定义枚举器或集合,允许您在枚举时修改集合。另一方面,你可能应该做一些完全不同的事情
我不确定你想做什么,但我觉得这看起来好多了:
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]);
}
List List=新列表();
增加第(1)款;
增加(2);
增加(3);
var outputList=新列表();
foreach(列表中的int i)
{
如果(i==2)
{
输出列表。添加(666);
//执行一些操作来刷新foreach循环
}
添加(列表[i]);
}
只需创建一个新列表。尽量不要改变数据结构。那相当脆弱。从旧数据中创建新数据通常更好。这不完全是您想要做的,但您可以这样做
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;
List List=新列表();
增加第(1)款;
增加(2);
增加(3);
List list2=新列表();
list2=列表;
foreach(列表中的int i)
{
如果(i==2)
{
清单2.添加(666);
}
系统.诊断.调试.写入(列表[i]);
i++;//增量i
}
列表=列表2;
是和否,已经给出了两个答案
有一种方法可以使用以下语法从LINQ修改foreach循环中的集合(实际上是列表):
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);
});
List List=新列表();
增加第(1)款;
增加(2);
增加(3);
list.ForEach(elt=>{
如果(elt==2){
增加(666);
}
系统.诊断.调试.写入(elt);
});
但是要小心。。。如果在条件内将“2”添加到列表中,您将进入无限状态:)如果您正在寻找一致的解决方案,您可以使用Linq而不是for loop或foreach loop(您不能更改foreach loop中的集合):
List List=新列表();
增加第(1)款;
增加(2);
增加(3);
//添加所需的“666”项
AddRange(Enumerable.Repeat(666,list.Count(x=>x==2));
//打印所有项目
foreach(列表中的项目)
系统.诊断.调试.写入(项);
此行为与foreach无关。这是由枚举器实现引起的。您有什么原因不想对循环使用吗?我看不到一个有效的例子,您能提供一个吗?由于枚举的性质,在foreach
-循环中添加元素通常不起作用。因此,我猜“真正”的解决方案与在for循环中添加元素不同。这将引发与使用foreach
循环相同的异常。@Habib该答案已过时。他们后来更改了ForEach
,如果集合从.NET 4.5开始被修改,就会抛出异常。@Servy,哦,我不知道,我没有使用ForEach
,也没有找到真正使用它的地方。
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);
});
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);