Рекомендуется ли удалить строку из DataTable в цикле Foreach? - PullRequest
0 голосов
/ 26 февраля 2012

Как видно из заголовка, рекомендуется ли удалять строку данных из таблицы данных в цикле foreach?

Вот что я получил до сих пор -

            foreach (DataRow row in dt.Rows)
            {
                billObj.callerID = Convert.ToInt64(row["callerID"]);
                billObj.bsRespond = billObj.chargePhone(billObj);
                if (!billObj.bsRespond.StartsWith("OK"))
                {
                    dt.Rows.Remove(row);
                }
            }

Ответы [ 3 ]

3 голосов
/ 26 февраля 2012

Конечно, нет, вы изменяете коллекцию, которую вы повторяете.Ваша программа взорвется, когда вы попытаетесь удалить строку там.Вы не можете изменить коллекцию при использовании созданного для нее перечислителя , иначе она выдаст InvalidOperationException().

1 голос
/ 26 февраля 2012

Почему бы просто не использовать другой перечислитель?

foreach (DataRow row in dt.Rows.Cast<DataRow>().ToArray())
{

...

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

Обычный способ сделать это, если отсутствует «RemoveAll (предикат)», это сохранить список удалений (здесь обобщенный для любого типа):

var remove = new List<SomeType>();
foreach(var row in source) {
    if(condition) remove.Add(row);
}
foreach(var obj in remove) {
    source.Remove(obj);
}

Однако, если доступно, то:

source.RemoveAll(row => condition);

подход проще.

...