C# 使用多个foreach循环修改DataTable

C# 使用多个foreach循环修改DataTable,c#,foreach,C#,Foreach,首先,如果可以的话,感谢您抽出时间提供帮助,现在开始提问。我正在修改现有的数据表以获得所需的输出 我已经编写了不执行任何操作、删除或添加列/行数据的代码。我使用数据集结果查看器查看了数据表,结果如所需。但问题就在这里,数据行和数据列都在foreach循环中,我现在得到的是“collection was modified枚举操作可能无法执行” 我在一个数据表中做了所有的事情,没有意识到如果这是正确的术语,它会使表不可变或不可修改。我复制了这个表,并在for循环中,作为StackOverflow的建

首先,如果可以的话,感谢您抽出时间提供帮助,现在开始提问。我正在修改现有的数据表以获得所需的输出

我已经编写了不执行任何操作、删除或添加列/行数据的代码。我使用数据集结果查看器查看了数据表,结果如所需。但问题就在这里,数据行和数据列都在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--)的索引移动到第一行