Search code examples
c#datatabledelete-row

DataTable, How to conditionally delete rows


I'm engaged in a C# learning process and it is going well so far. I however just now hit my first "say what?" moment.

The DataTable offers random row access to its Rows collection, not only through typical collections behavior, but also through DataTable.Select. However I cannot seem to be able to tie this ability to DataRow.Delete. So far this is what it seems I need to do in order to conditionally delete one or more rows from a table.

int max = someDataTable.Rows.Count - 1;
for(int i = max; i >= 0; --i)
{
    if((int)someDataTable.Rows[i].ItemArray[0] == someValue)
    {
        someDataTable.Rows[i].BeginEdit();
        someDataTable.Rows[i].Delete();
    }
    else
        break;
}
someDataTable.AcceptChanges();

But I'm not happy with this code. Neither I'm convinced. I must be missing something. Am I really forced to hit the Rows collection sequentially if I need to delete one or more rows conditionally?

(don't mind the inverted for. I'm deleting from the end of the datatable. So it's ok)


Solution

  • You could query the dataset and then loop the selected rows to set them as delete.

    var rows = dt.Select("col1 > 5");
    foreach (var row in rows)
       { row.Delete(); }
       dt.AcceptChanges();
       
    

    ... and you could also create some extension methods to make it easier ...

    myTable.Delete("col1 > 5");
    
    public static DataTable Delete(this DataTable table, string filter)
    {
        table.Select(filter).Delete();
        return table;
    }
    public static void Delete(this IEnumerable<DataRow> rows)
    {
        foreach (var row in rows)
            row.Delete();
    }