Безопасно удаляющий DataRow в ForEach

Я не понимаю, почему этот код не работает.

foreach (DataRow dataRow in dataTable.Rows)
{
    if (true)
    {
        dataRow.Delete();
    }
}
38
задан Adam Eberbach 21 March 2014 в 04:34
поделиться

6 ответов

Хотя DataRow.Delete не изменяет состояние коллекции, в документации Microsoft указано, что вы не следует вызывать его во время итерации по коллекции:

Ни Delete, ни Remove не должны вызываться в цикле foreach во время итерации по объекту DataRowCollection. Удалить или Удалить изменить состояние коллекции.

Лучшее решение обычно - создать отдельную коллекцию (например, List ) элементов, которые вы хотите удалить, а затем удалить их после того, как вы закончили итерацию .

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

31
ответ дан 27 November 2019 в 03:06
поделиться

Содержимое строк изменяется во время итерации, если вы удаляете одну строку, что делает итерацию недействительной.

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

1
ответ дан 27 November 2019 в 03:06
поделиться

Вы не можете изменить коллекцию во время итерации с помощью оператора 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();
}
19
ответ дан 27 November 2019 в 03:06
поделиться

Это относится практически к любой коллекции. Если вы попытаетесь удалить элемент во время цикла по коллекции, у вас возникнут проблемы. Например, если вы удалите ряд №3, то предыдущий ряд №4 станет рядом №3.

0
ответ дан 27 November 2019 в 03:06
поделиться

Используйте это:

for (int i = 0; i < myDataTable.Rows.Count; i++)

{

 myDataTable[i].Delete();

}
0
ответ дан 27 November 2019 в 03:06
поделиться

Самый безопасный способ - используйте для цикла

for (int i = datatable.Rows.Count - 1; i >= 0; i--) 
{
    if (true)
    {
        datatable.Rows[i].Delete();
    }
}

Не забудьте AcceptChanges , чтобы удалить все отмеченные строки:

datatable.AcceptChanges();
51
ответ дан 27 November 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: