Безопасное удаление DataRow в ForEach - PullRequest
38 голосов
/ 26 февраля 2010

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

foreach (DataRow dataRow in dataTable.Rows)
{
    if (true)
    {
        dataRow.Delete();
    }
}

Ответы [ 15 ]

0 голосов
/ 09 мая 2017

Sure Magents

Вот как я это сделал и отлично работает

dt = GetStationeryConsolidationDetails(txtRefNo.Text);
int intRows = dt.Rows.Count;
int x = 0;
for (int c = 0; c < intRows; c++)
{
  if (dt.Rows[c - x]["DQTY"].ToString() == "0")
  {
    dt.Rows[c - x].Delete();
    dt.AcceptChanges();
    x++;        
  }
}
0 голосов
/ 23 ноября 2016

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

Поэтому вы должны использовать другой массив для итерации и удаления их из свойства Rows.

foreach (DataRow dataRow in dataTable.Select())
{
    if (true)
    {
        dataTable.Rows.Remove(dataRow);
    }
}
0 голосов
/ 14 декабря 2010

Там, где у предметов есть Count, вот что я сделал:

int Count = myTable.Rows.Count;

while (Count > 0) // replace condition with myTable.Rows.Count if unconditionally performed on all rows
{
    DataRow row = myTable.Rows[0] // or however you want to find your index

    // do some work
    myTable.Rows.Remove(row);

    // if you want to perform a check to break out of while
    if (someCondition)
        Count = 0;
    else
        Count = myTable.Rows.Count;
}

Обратите внимание, что там, где объекты имеют коллекцию .GetXXXX(), например FileInfo (IIRC), удаление содержимого элемента в foreach допустимо. Одним из решений, которое я рассмотрел, является создание метода расширения, который обеспечивает метод .GetItems().

0 голосов
/ 19 апреля 2010

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

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

{

 myDataTable[i].Delete();

}
0 голосов
/ 26 февраля 2010

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

...