收集被修改;即使对行计数应用验证,枚举操作也可能无法执行?

时间:2012-01-10 16:14:29

标签: c# collections

嗨,对不起,我是C#编程的初学者,虽然我知道在这个问题上创建了很多线程,但我似乎找不到适用于我的情况的线程,特别是因为我已经应用了这个在其他形式,它的工作。

This解决方案告诉我向后迭代它,但我不知道如何/在哪里应用它。我在

中的 中收到错误
foreach (DataRow dataRow_AvailableEmp in AvailableEmp_dataTable.Rows)

这是代码的其余部分。

    if (WithTasks_Datatable.Rows.Count > 0)
    {
        foreach (DataRow dataRow_WithTask in WithTasks_Datatable.Rows)
        {
            Booked_Initial = dataRow_WithTask["Assigned"].ToString();
            if (this_Initial != Booked_Initial) //di booked
            {
                //CHECK IF IN DATATABLE                                
                if (AvailableEmp_dataTable.Rows.Count > 0)
                {
                    foreach (DataRow dataRow_AvailableEmp in AvailableEmp_dataTable.Rows)
                    {
                        Available_Initial = dataRow_AvailableEmp["EmpID"].ToString();

                        if (this_Initial != Available_Initial) //NOT IN DB
                        {
                            //ADD

                            AvailableEmp_dataTable.Rows.Add(this_EmpID, this_Initial, PositionName, TeamName, TeamLead);
                        }
                    }
                }
                else
                {
                    //ADD
                    AvailableEmp_dataTable.Rows.Add(this_EmpID, this_Initial, PositionName, TeamName, TeamLead);
                }
            }
        }
    }

5 个答案:

答案 0 :(得分:7)

一个简单的解决方案是将您正在迭代的行放入新列表中:

foreach (DataRow dataRow_AvailableEmp in AvailableEmp_dataTable.Rows.Cast<DataRow>().ToList())

答案 1 :(得分:1)

您不能/不应该修改通过枚举器访问的集合。

基本上,如果您对集合进行更改,那么枚举器会找到上一个或下一个记录,这会改变下一个或之前的内容....

按照@mhornfeck

的建议,通过索引进行此访问的两次攻击

或者您创建一个空的数据表,添加到它们。 然后将添加的行追加到原始集合中。

答案 2 :(得分:0)

要向后迭代,请使用for代替foreach

for (int i = AvailableEmp_dataTable.Rows.Count - 1; i >= 0; --i)
        {
            DataRow dataRow_AvailableEmp = AvailableEmp_dataTable.Rows[i];
            Available_Initial = dataRow_AvailableEmp["EmpID"].ToString();

            if (this_Initial != Available_Initial) //NOT IN DB
            {
                //ADD
                AvailableEmp_dataTable.Rows.Add(this_EmpID, this_Initial, PositionName, TeamName, TeamLead);
            }
        }

来自http://www.dotnetperls.com/foreach

  

foreach循环结构提供了一种优雅循环的方法   元素,但它有限制任何突变的缺点   循环中的集合。

答案 3 :(得分:0)

如果你想使用foreach(没有理由你应该),你将需要循环一次以创建一个你想要添加的所有员工的列表。迭代员工列表以添加并添加到数据库中。

答案 4 :(得分:0)

该解决方案适用于从集合中移除项目,用于防止迭代变量在删除中间项目后跳过项目(有点像逃离摇摇欲坠的悬崖边。它不适用于添加项目(也不会向前迭代),因为您的Count会定期更改。

要遍历集合并根据您找到的内容添加项目,请将项目添加到临时List<DataRow>,然后在迭代完成后将其添加到DataTable