Я не понимаю, почему этот код не работает.
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
Хотя DataRow.Delete
не изменяет состояние коллекции, в документации Microsoft указано, что вы не следует вызывать его во время итерации по коллекции:
Ни Delete, ни Remove не должны вызываться в цикле foreach во время итерации по объекту DataRowCollection. Удалить или Удалить изменить состояние коллекции.
Лучшее решение обычно - создать отдельную коллекцию (например, List
) элементов, которые вы хотите удалить, а затем удалить их после того, как вы закончили итерацию .
Это также решение для ситуаций, когда вы хотите удалить элементы из коллекции, поскольку большинство коллекций в .NET не позволяют вам изменять содержимое коллекции во время итерации по ней.
Содержимое строк
изменяется во время итерации, если вы удаляете одну строку, что делает итерацию недействительной.
Однако вы можете сначала скопировать строки в коллекцию, а затем выполнить итерацию по коллекции и таким образом удалить строки. Это гарантирует, что итерация не будет прервана изменением данных для итерации.
Вы не можете изменить коллекцию во время итерации с помощью оператора foreach
.
вы можете попробовать что-нибудь вроде этого:
List<DataRow> deletedRows = new List<DataRow>();
foreach (DataRow dataRow in dataTable.Rows)
{
if(true) deletedRows.Add(dataRow);
}
foreach(DataRow dataRow in deletedRows)
{
dataRow.Delete();
}
Это относится практически к любой коллекции. Если вы попытаетесь удалить элемент во время цикла по коллекции, у вас возникнут проблемы. Например, если вы удалите ряд №3, то предыдущий ряд №4 станет рядом №3.
Используйте это:
for (int i = 0; i < myDataTable.Rows.Count; i++)
{
myDataTable[i].Delete();
}
Самый безопасный способ - используйте для
цикла
for (int i = datatable.Rows.Count - 1; i >= 0; i--)
{
if (true)
{
datatable.Rows[i].Delete();
}
}
Не забудьте AcceptChanges
, чтобы удалить все отмеченные строки:
datatable.AcceptChanges();