Как удалить несколько строк в DataTable?
Как я могу удалить определенные DataRows в цикле строк DataTable, которые соответствуют настраиваемому условию, - говорят, что строки имеют индекс четного числа? (Без использования LINQ)
Спасибо
Ответы
Ответ 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);
}
}