Подтвердить что ты не робот

Как удалить несколько строк в DataTable?

Как я могу удалить определенные DataRows в цикле строк DataTable, которые соответствуют настраиваемому условию, - говорят, что строки имеют индекс четного числа? (Без использования LINQ)

Спасибо

4b9b3361

Ответ 1

Это зависит от того, что вы подразумеваете под "delete".

Если вы хотите отметить их как удаленные, просто вызовите метод Delete() для каждой строки, когда вы посещаете его в своем цикле. Затем вам нужно вызвать AcceptChanges() в таблице данных, чтобы завершить удаление - предположительно, после обновления базы данных (если она задействована).

foreach( DataRow row in someTable.Rows )
{
    if( /* your condition here */ )
        row.Delete();
}
someTable.AcceptChanges();

Если вы хотите удалить его из DataTable, вам нужно сделать это за два прохода:

List<DataRow> rowsToDelete = new List<DataRow>();
foreach( DataRow row in someTable.Rows )
{
    if( /* your condition here */ )
    {
        rowsToDelete.Add( row );
    }
}

foreach( DataRow row in rowsToDelete )
{
    someTable.Rows.Remove( row );
}

Стоит отметить, что вы всегда можете использовать первый метод для удаления строк - поскольку маркировка строк как Deleted, а затем принятие изменений автоматически удалит их из таблицы. Но иногда проще и проще просто удалять объекты DataRow из коллекции Rows.

Ответ 2

Попробуйте что-то вроде этого примера

DataTable table = new DataTable();
table.Columns.Add("Foo",typeof(int));
for (int i = 0; i < 10; i++)
    table.Rows.Add(i);

for (int i = table.Rows.Count -1; i >=0; i--)
{
    // sample removes all even foos
    if ((int)table.Rows[i]["Foo"] % 2 == 0)
        table.Rows.RemoveAt(i);
}

Ответ 3

Другим способом является

    DataRow[] DrArrCheck = DataTableName.Select("ID > 0");
    foreach(DataRow DrCheck in DrArrCheck)
    {
        DataTableName.Rows.Remove(DrCheck);
    }

Ответ 4

Если вам требуется более короткое решение, чем предлагаемое выше, попробуйте выполнить цикл над списком результатов и использовать лямбда, например sub(x), чтобы удалить каждую из этих строк.

dt.Select("Column1 > 0").ToList.ForEach(Sub(x) dt.Rows.Remove(x))

Ответ 5

 public static void DeleteRowsFromDataTable(DataTable dataTable, string columnName, string columnValue)
        {
            IEnumerable<DataRow> dataRows = (from t in dataTable.AsEnumerable()
                                             where t.Field<string>(columnName) == columnValue
                                             select t);
            foreach (DataRow row in dataRows)
                dataTable.Rows.Remove(row);
        }

Ответ 6

Чтобы удалить несколько строк (например, 50 000 из 100 000), гораздо быстрее скопировать базу данных, чем выполнять либо datatable.Rows.Remove(row) или row.Delete(). Например:

DataRow[] rowsToKeep = datatable.Select("ID > 50000");
DataTable tempDataTable= rowsToKeep.CopyToDataTable;
dataTable.Clear();
dataTable.Merge(tempDataTable);
tempDataTable.Dispose();

Ответ 7

попробуйте выполнить итерацию по результату Select(). Это очень похоже на другие ответы, но я считаю, что это самый прямой

DataRow[] r = table.Select();
for (int i = 0; i < r.Length; i++)
{
    if (i % 2 == 0)
        r[i].Delete();
}

Ответ 8

Я всегда использовал "двухфазный" подход Л.Бушкина, и я, наконец, решил, что стоит написать для него функцию:

    public delegate bool DataRowComparer(DataRow dr);

    public static void RemoveDataRows(DataTable table, DataRowComparer drc)
    {
        List<DataRow> RowsToRemove = new List<DataRow>();
        foreach (DataRow dr in table.Rows)
            if (drc(dr))
                RowsToRemove.Add(dr);
        foreach (DataRow dr in RowsToRemove)
            table.Rows.Remove(dr);
    }

И теперь я могу удалить строки с одной строкой кода (например):

RemoveDataRows(dt, row => row["StringVal"].ToString() == "B" && (Int16)(row["NumberVal"]) >= 4);

В случае, если это поможет кому-то...

(И любые способы сокращения аббревиатуры оцениваются.)

Ответ 9

Вот как я это сделал, когда столкнулся с этой проблемой.

Dim index As Integer = 0
Dim count As Integer = resultsDT.Rows.Count - 1
For i As Integer = 0 To count
    If resultsDT.Rows(index).Item("something") = "something" Then                               
        resultsDT.Rows(index).Delete()
        resultsDT.AcceptChanges()
        index = index - 1
    End If
    index = index + 1
    i = i + 1
Next

Ответ 10

попробуйте это

foreach(DataRow oRow in YourDataTable.Rows)
{
  if ("Check You Condition")
   {
      YourDataTable.Rows.Remove(oRow);
   }
}