views:

72

answers:

2

I have a data table and I want to delete a row here is my code it's throwing me an exception

 foreach (DataRow row in dt1.Rows)
                            {
                                if ((row["Name"] == "Select a Lookbook") || (row["Name"] == "Create a new Lookbook"))
                                {
                                    row.Delete();
                                    dt1.AcceptChanges();
                                }
                            }

I even tried outside the if statment and outside forloop still throws me error any idea how to achieve this task this is the exception I get:

Collection was modified; enumeration operation might not execute.

Final working Code:

 foreach (DataRow row in dt1.Select())
                            {
                                if ((row["Name"] == "Select a Lookbook") ||    (row["Name"] == "Create a new Lookbook"))
                                {                                 row.Delete();                                       
                                }

                            }
+3  A: 

Create a list of rows to delete while iterating over DataTable.Rows, then delete them all separately.

Non-LINQ solution:

List<DataRow> rowsToDelete = new List<DataRow>();
foreach (DataRow row in dt1.Rows)
{
    if ((row["Name"] == "Select a Lookbook") || 
        (row["Name"] == "Create a new Lookbook"))
    {
        rowsToDelete.Add(row);
    }
}
foreach (DataRow row in rowsToDelete)
{
    row.Delete();
}
dt1.AcceptChanges();

LINQ solution:

List<DataRow> rowsToDelete = dt1.Rows.AsEnumerable()
    .Where(row => (row["Name"] == "Select a Lookbook") || 
                  (row["Name"] == "Create a new Lookbook"))
    .Tolist();
foreach (DataRow row in rowsToDelete)
{
    row.Delete();
}
dt1.AcceptChanges();
Jon Skeet
I know it's a very good answer but I have to go with Pierre's answer as I believe easy does it. I really appreciate your help.
fzshah76
+2  A: 

Instead of using dt1.Rows, use dt1.Select()

The goal here is not to use the collection itself, but rather an array of row that is not the Rows collection

Pierre-Alain Vigeant
Worked exactly as I wanted, Thanks
fzshah76