Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过在循环中添加更多元素来扩展foreach循环_C#_Loops_Foreach - Fatal编程技术网

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);