Сравнить и удалить в списке/таблице

  • Автор темы Автор темы Nord
  • Дата начала Дата начала

Nord

Client
Регистрация
22.03.2012
Сообщения
2 432
Реакции
1 494
Баллы
113
Дано таблицу и список.
Таблица 15х4000( 15 столбцов и 4000 строк). В 11 столбце идут интересующие нас IDшники.
Список — ~3000 IDшников.
Нужно удалить с таблицы те строки, которые имеют в 11 столбце такие же ID.

"Сочинил" такое
C#:
Развернуть Свернуть Копировать
int k = project.Tables["Error"].RowCount;
for (int i = k; i > 0; i--)
    {
        var m=i-1; //Т.к. количество строк на 1 больше чем порядковый номер последней  строки
        var colums = new List<string>(project.Tables["Error"].GetRow(m));
 
              for(int j =0; j< project.Lists["ID"].Count; j++)
                    {
                        if (colums[10] == project.Lists["ID"][j])
                                {
                                      project.Tables["Error"].DeleteRow(m);
                                }
                    } 

    }
По сути сравниваем два списка простым перебором. Куда уж проще.
В таком варианте проверка и удаление занимает минут 20.
Понятно, что 4000*3000= 12 млн операций ( ну ладно, проходит только половина) должно занимать время.

Помню, тут были похожие темы, и там был преложен вариант, который ни какие-то абсурдные 4 к и 3 к сравнивает, а миллионы строк за несколько секунд.
Но никак не могу найти...
Или мне просто приснилось то решение? =)
Есть идеи, как ускорить процесс?

АП
Только что понял, что для ускорения, нужно и найденную строку из списка удалять, чтоб потом ее опять не проверять с другими строками. Думаю, скорости прибавит, но не сильно
 
Последнее редактирование:
Дано таблицу и список.
Таблица 15х4000( 15 столбцов и 4000 строк). В 11 столбце идут интересующие нас IDшники.
Список — ~3000 IDшников.
Нужно удалить с таблицы те строки, которые имеют в 11 столбце такие же ID.

"Сочинил" такое
C#:
Развернуть Свернуть Копировать
int k = project.Tables["Error"].RowCount;
for (int i = k; i > 0; i--)
    {
        var m=i-1; //Т.к. количество строк на 1 больше чем порядковый номер последней  строки
        var colums = new List<string>(project.Tables["Error"].GetRow(m));
 
              for(int j =0; j< project.Lists["ID"].Count; j++)
                    {
                        if (colums[10] == project.Lists["ID"][j])
                                {
                                      project.Tables["Error"].DeleteRow(m);
                                }
                    } 

    }
По сути сравниваем два списка простым перебором. Куда уж проще.
В таком варианте проверка и удаление занимает минут 20.
Понятно, что 4000*3000= 12 млн операций ( ну ладно, проходит только половина) должно занимать время.

Помню, тут были похожие темы, и там был преложен вариант, который ни какие-то абсурдные 4 к и 3 к сравнивает, а миллионы строк за несколько секунд.
Но никак не могу найти...
Или мне просто приснилось то решение? =)
Есть идеи, как ускорить процесс?

АП
Только что понял, что для ускорения, нужно и найденную строку из списка удалять, чтоб потом ее опять не проверять с другими строками
Я тоже где-то видел что кто то там строки сравнивал. Миллион строк с другим миллионом. Вроде есть такое ну или мне тоже приснилось)
 
Я тоже где-то видел что кто то там строки сравнивал. Миллион строк с другим миллионом. Вроде есть такое ну или мне тоже приснилось)
Видел, но вот хоть убей, не могу найти ни внутренним поиском, ни гуглом
 
Только что понял, что для ускорения, нужно и найденную строку из списка удалять, чтоб потом ее опять не проверять с другими строками. Думаю, скорости прибавит, но не сильн
раза в 2
 
А там где нам приснилось, или может нет миллионы строк сравнивались за секунды. Я тоже точно помню что это где-то было. Такую тему надо было сразу в закладки не думая(
 
Правильно ли я понял, переносим колонку из таблицы и наш список в массивы. Потом этим кодом
C#:
Развернуть Свернуть Копировать
mass2.AsParallel().Except(mass1.AsParallel()).ToArray();
исключаем один массив из другого и на выходе получаем третий массив с тем, что нужно оставить в таблице, а другое удаляем из таблицы.
Хотя опять начал за здравие, а закончил за упокой =)
 
Только что понял, что для ускорения, нужно и найденную строку из списка удалять, чтоб потом ее опять не проверять с другими строками. Думаю, скорости прибавит, но не сильно
Что-то я вообще не понял твой код, зачем-то при каждой итерации цикла инициализируется новый список, но не суть)) Попробуй так:
C#:
Развернуть Свернуть Копировать
IZennoList list = project.Lists["ID"];
IZennoTable table = project.Tables["Error"];

for (int i = 0; i < list.Count; i++)
    for (int j = 0; j < table.RowCount; j++)
        if (list[i] == table.GetCell(10, j)) {
            table.DeleteRow(j);
            break;
        }
 
  • Спасибо
Реакции: Solomon21 и proffman
Что-то я вообще не понял твой код, зачем-то при каждой итерации цикла инициализируется новый список, но не суть)) Попробуй так:
Что то я не могу понять что не так в этом коде, вместо списка добавил таблицу еще одну таблицу. Специально сделал все строки дублями во второй таблице, не все строки удаляются. Из 152 строк осталось 74.
Не понимаю в чем проблема... помоги плиз!!!!! :dy:
C#:
Развернуть Свернуть Копировать
IZennoTable list = project.Tables["Table1"];
IZennoTable table = project.Tables["Table2"];

for (int i = 0; i < table.RowCount; i++)
    for (int j = 0; j < table.RowCount; j++)
        if (list.GetCell(1, i) == table.GetCell(1, j)) {
            table.DeleteRow(j);
        }
-------------
А вот и ошибка table.RowCount, не углядел её сразу. Спасибо. :ay:
C#:
Развернуть Свернуть Копировать
IZennoTable list = project.Tables["Table1"];
IZennoTable table = project.Tables["Table2"];

for (int i = 0; i < list.RowCount; i++)
    for (int j = 0; j < table.RowCount; j++)
        if (list.GetCell(1, i) == table.GetCell(1, j)) {
            table.DeleteRow(j);
        }
 
Последнее редактирование:
  • Спасибо
Реакции: Solomon21
Что-то я вообще не понял твой код, зачем-то при каждой итерации цикла инициализируется новый список, но не суть)) Попробуй так:
C#:
Развернуть Свернуть Копировать
IZennoList list = project.Lists["ID"];
IZennoTable table = project.Tables["Error"];

for (int i = 0; i < list.Count; i++)
    for (int j = 0; j < table.RowCount; j++)
        if (list[i] == table.GetCell(10, j)) {
            table.DeleteRow(j);
            break;
        }

Комментарии в коде хотелось бы видеть.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)