Как я могу удалить определенные DataRows в цикле строк DataTable, которые соответствуют настраиваемому условию, - говорят, что строки имеют индекс четного числа? (Без использования LINQ)
Спасибо
Как я могу удалить определенные DataRows в цикле строк DataTable, которые соответствуют настраиваемому условию, - говорят, что строки имеют индекс четного числа? (Без использования LINQ)
Спасибо
Это зависит от того, что вы подразумеваете под "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
.
Попробуйте что-то вроде этого примера
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);
}
Другим способом является
DataRow[] DrArrCheck = DataTableName.Select("ID > 0");
foreach(DataRow DrCheck in DrArrCheck)
{
DataTableName.Rows.Remove(DrCheck);
}
Если вам требуется более короткое решение, чем предлагаемое выше, попробуйте выполнить цикл над списком результатов и использовать лямбда, например sub(x)
, чтобы удалить каждую из этих строк.
dt.Select("Column1 > 0").ToList.ForEach(Sub(x) dt.Rows.Remove(x))
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);
}
Чтобы удалить несколько строк (например, 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();
попробуйте выполнить итерацию по результату Select(). Это очень похоже на другие ответы, но я считаю, что это самый прямой
DataRow[] r = table.Select();
for (int i = 0; i < r.Length; i++)
{
if (i % 2 == 0)
r[i].Delete();
}
Я всегда использовал "двухфазный" подход Л.Бушкина, и я, наконец, решил, что стоит написать для него функцию:
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);
В случае, если это поможет кому-то...
(И любые способы сокращения аббревиатуры оцениваются.)
Вот как я это сделал, когда столкнулся с этой проблемой.
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
попробуйте это
foreach(DataRow oRow in YourDataTable.Rows)
{
if ("Check You Condition")
{
YourDataTable.Rows.Remove(oRow);
}
}