嗨,对不起,我是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);
}
}
}
}
答案 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
。