Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как удалить в DataTable одинаковые записи, Неужели нельзя проще? 
:(
    Опции темы
Иван Человеков
  Дата 21.8.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 11.3.2006
Где: Минск

Репутация: нет
Всего: 1



Добрый день!
Подскажите пожалуйста как удалить в DataTable одинаковые записи проще чем я это сделал?
Код
            dtTableMaster.Columns.Add(FLD_Del_RECORD, typeof(int));  //Столбец это флаг - встречалось подразделение или нет (удалять или нет)
            foreach (DataRow dr in dtTableMaster.Rows)
            {
                bool bFlag = false;     //Флаг. Первую запись удалять нельзя
                foreach (DataRow dr2 in dtTableMaster.Rows)
                {
                    if ((dr[FLD_DEPARTMENT_ID].ToString() == dr2[FLD_DEPARTMENT_ID].ToString()))
                    {
                        if (bFlag)
                            dr2[FLD_Del_RECORD] = 1;       //Флаг. Эту запись надо удалить.

                        bFlag = true;   //Второй вход разрешаю на пометку записи для удаления
                    }
                }
            }
            //Удаляю по флагу записи
            foreach (DataRow dr in dtTableMaster.Rows)
            {
                if (dr[FLD_Del_RECORD] != DBNull.Value)
                    dr.Delete();
            }
            dtTableMaster.AcceptChanges();

Удаляю во втором цикле. Если вместо удаления во втором цикле, писать сразу:
Код
if (bFlag)
{
  dr.Delete();
}

Получаю : Deleted row information cannot be accessed through the row. тоесть - К удаленной информации ряда нельзя получить доступ через ряд.
Если применяю 
Код
if (bFlag)
{
  dr.Delete();
  dtTableMaster.AcceptChanges();
}
, получаю : Collection was modified; enumeration operation might not execute., тоесть Коллекция была изменена; операция перечисления не могла бы выполнить.

Как можно упростить код? Как верно работать в DataTable со строками при удалении?
Спасибо.
PM ICQ   Вверх
mihryak
Дата 21.8.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: нет
Всего: 36



попробуй так - сначала создаётся список дубликатов (группируются по колонке "департамент", выбираются списки длиной более 1 элемента, из них все, кроме первого, попадают в результирующий список), потом каждый из них удаляется
Код

            foreach (DataRow row in dtTableMaster.Rows
                                    .Cast<DataRow>()
                                    .GroupBy(row => row[FLD_DEPARTMENT_ID])
                                    .Where(g => g.Count() > 1)
                                    .SelectMany(g => g.Skip(1)))
            {
                row.Delete();
            }
            dtTableMaster.AcceptChanges();


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

для повышения производительности (если её вдруг окажется недостаточно), можешь поступать схожим образом, но в цикле вместо выставлени пометки о дубликатности добавляй сам дубликат во временный список, удаляя уже строки пробежкой по нему

тут есть ещё и, наверное, едиственное действительно верное решение - не допускать появление дубликатов в ключевом поле. решается как средствами Sql (в большинстве случаев может хватить), так и программно (дополнительно к Sql!) свойствами классов ADO.Net (PrimaryKey, Unique)

Это сообщение отредактировал(а) mihryak - 21.8.2009, 16:53
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0704 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.