C# 使用多个foreach循环修改DataTable
首先,如果可以的话,感谢您抽出时间提供帮助,现在开始提问。我正在修改现有的数据表以获得所需的输出 我已经编写了不执行任何操作、删除或添加列/行数据的代码。我使用数据集结果查看器查看了数据表,结果如所需。但问题就在这里,数据行和数据列都在foreach循环中,我现在得到的是“collection was modified枚举操作可能无法执行” 我在一个数据表中做了所有的事情,没有意识到如果这是正确的术语,它会使表不可变或不可修改。我复制了这个表,并在for循环中,作为StackOverflow的建议,尝试向后遍历它。但它没有起作用。因此,我认为我可能需要创建一个新方法,并在其中创建一个新的数据表,然后设置列,实例化数据表,并在原始表中循环。然后将行添加到新表并返回该表 但我甚至不知道如何开始这个过程,我有点困惑什么是最好的方法,可以使用一些建议。这是我的代码,如果有帮助的话。我有很多小的扩展方法来完成大部分工作。谢谢你对此事的任何建议C# 使用多个foreach循环修改DataTable,c#,foreach,C#,Foreach,首先,如果可以的话,感谢您抽出时间提供帮助,现在开始提问。我正在修改现有的数据表以获得所需的输出 我已经编写了不执行任何操作、删除或添加列/行数据的代码。我使用数据集结果查看器查看了数据表,结果如所需。但问题就在这里,数据行和数据列都在foreach循环中,我现在得到的是“collection was modified枚举操作可能无法执行” 我在一个数据表中做了所有的事情,没有意识到如果这是正确的术语,它会使表不可变或不可修改。我复制了这个表,并在for循环中,作为StackOverflow的建
internal void ParseNames(DataTable ConvertExcelToDataTable)
{
try
{
if (ConvertExcelToDataTable != null && ConvertExcelToDataTable.Rows != null)
{
foreach(DataRow dr in ConvertExcelToDataTable.Select())
{
foreach(DataColumn col in ConvertExcelToDataTable.Columns)
{
ConvertExcelToDataTable.AcceptChanges(); //initial DataTable Save
dr.Table.Columns.RemoveItem("LOB");
dr.Table.Columns.RemoveItem("UMID");
dr.Table.Columns.RemoveItem("MBR_SEX");
dr.Table.Columns.RemoveItem("DOS");
dr.Table.Columns.RemoveItem("Measures");
dr.Table.Columns.RemoveItem("ProjectName");
dr.Table.Columns.RemoveItem("Project Name");
dr.Table.Columns.RemoveItem("MemberKey");
dr.Table.Columns.RemoveItem("MSR_KEY");
dr.Table.Columns.RemoveItem("PRV_LAST");
dr.Table.Columns.RemoveItem("PRV_FIRST");
dr.Table.Columns.RemoveItem("PRV_MI");
dr.Table.Columns.RemoveItem("LocationName");
dr.Table.Columns.RemoveItem("Request ID");
dr.Table.Columns.RemoveItem("Measure(s)");
dr.Table.Columns.ReplaceItem("", "3");
dr.Table.Columns.ReplaceItem(" ", "3");
dr.Table.Columns.RenamingColumnValue("PERS_FIRST_NAME", "First_Name");
dr.Table.Columns.RenamingColumnValue("FirstName", "First_Name");
dr.Table.Columns.RenamingColumnValue("MBR_FIRST", "First_Name");
dr.Table.Columns.RenamingColumnValue("MBR_LAST", "Last_Name");
dr.Table.Columns.RenamingColumnValue("LastName", "Last_Name");
dr.Table.Columns.RenamingColumnValue("Gender", "Gender");
dr.Table.Columns.RenamingColumnValue("MBR_SEX", "Gender");
dr.Table.Columns.RenamingColumnValue("PERS_MID_INIT", "Middle_Initial");
dr.Table.Columns.RenamingColumnValue("MBR_MI", "Middle_Initial");
dr.Table.Columns.RenamingColumnValue("BIRTHDATE", "Date_of_Birth");
dr.Table.Columns.RenamingColumnValue("PatientDOB", "Date_of_Birth");
dr.Table.Columns.RenamingColumnValue("DOB", "Date_of_Birth");
dr.Table.Columns.RemoveSpecialCharacters("(");
dr.Table.Columns.RemoveSpecialCharacters(")");
dr.Table.Columns.RemoveSpecialCharacters(",");
dr.Table.Columns.RemoveSpecialCharacters("=");
dr.Table.Columns.RemoveSpecialCharacters("!");
dr.Table.Columns.RemoveSpecialCharacters("-");
dr.Table.Columns.SplitPatientData("Patient Name");
dr.Table.Columns.SplitPatientData("PatientName");
dr.Table.Columns.SplitPatientData("Patient, Name");
dr.Table.Columns.RenamingColumnValue("Patient", "First_Name");
dr.Table.Columns.RenamingColumnValue("Name", "Last_Name");
SplitPatientRowData(ConvertExcelToDataTable);
dr.Table.Columns.RemoveItem("Patient Name");
ReverseRowsInDataTable(ConvertExcelToDataTable);
ConvertExcelToDataTable.AcceptChanges();
}
}
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
}
您所做的基本上是将
DataTable
转换为另一个DataTable
。您可以创建一个新的DataTable
并从方法返回它,而不是就地修改现有的数据表。这样,您就不会在迭代时修改DataTable
internal DataTable ParseNames(DataTable ConvertExcelToDataTable)
{
if (ConvertExcelToDataTable == null && ConvertExcelToDataTable.Rows == null)
{
return null;
}
var output = new DataTable();
// Add columns here
try
{
foreach(DataRow dr in ConvertExcelToDataTable.Select())
{
// Add rows here
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
return output;
}
您所做的基本上是将
DataTable
转换为另一个DataTable
。您可以创建一个新的DataTable
并从方法返回它,而不是就地修改现有的数据表。这样,您就不会在迭代时修改DataTable
internal DataTable ParseNames(DataTable ConvertExcelToDataTable)
{
if (ConvertExcelToDataTable == null && ConvertExcelToDataTable.Rows == null)
{
return null;
}
var output = new DataTable();
// Add columns here
try
{
foreach(DataRow dr in ConvertExcelToDataTable.Select())
{
// Add rows here
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
return output;
}
你想干什么?在迭代列的同时删除列-将会爆炸;但我不知道你为什么要操纵列数据?您不应该编辑行数据吗?我可以看到此循环的任何实用程序
foreach(ConvertExcelToDataTable.Columns中的DataColumn列)
,您在这里所做的是处理DataRows
,使用foreach
,您将得到异常,因为它不允许在循环期间修改集合。正确,我正在删除行数据,我为这一混乱道歉。由于某些列不是新表中所需的公共字段,因此正在删除它们。还有@Badro那是我的问题!我觉得自己很傻,我真的很感谢你们花时间回答我。非常感谢。从集合(行)中删除项时,您需要从最后一行开始,然后使用(int i=rows.Count-1;i>=0;i--)之类的索引移动到第一行,您想做什么?在迭代列的同时删除列-将会爆炸;但我不知道你为什么要操纵列数据?您不应该编辑行数据吗?我可以看到此循环的任何实用程序foreach(ConvertExcelToDataTable.Columns中的DataColumn列)
,您在这里所做的是处理DataRows
,使用foreach
,您将得到异常,因为它不允许在循环期间修改集合。正确,我正在删除行数据,我为这一混乱道歉。由于某些列不是新表中所需的公共字段,因此正在删除它们。还有@Badro那是我的问题!我觉得自己很傻,我真的很感谢你们花时间回答我。非常感谢。从集合(行)中删除项时,您需要从最后一行开始,然后使用类似(int i=rows.Count-1;i>=0;i--)的索引移动到第一行