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

Nord

Client
Регистрация
22.03.2012
Сообщения
2 406
Благодарностей
1 473
Баллы
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 к сравнивает, а миллионы строк за несколько секунд.
Но никак не могу найти...
Или мне просто приснилось то решение? =)
Есть идеи, как ускорить процесс?

АП
Только что понял, что для ускорения, нужно и найденную строку из списка удалять, чтоб потом ее опять не проверять с другими строками. Думаю, скорости прибавит, но не сильно
 
Последнее редактирование:

Alelsey1611

Client
Регистрация
18.08.2017
Сообщения
402
Благодарностей
29
Баллы
28
Дано таблицу и список.
Таблица 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 к сравнивает, а миллионы строк за несколько секунд.
Но никак не могу найти...
Или мне просто приснилось то решение? =)
Есть идеи, как ускорить процесс?

АП
Только что понял, что для ускорения, нужно и найденную строку из списка удалять, чтоб потом ее опять не проверять с другими строками
Я тоже где-то видел что кто то там строки сравнивал. Миллион строк с другим миллионом. Вроде есть такое ну или мне тоже приснилось)
 

Nord

Client
Регистрация
22.03.2012
Сообщения
2 406
Благодарностей
1 473
Баллы
113
Я тоже где-то видел что кто то там строки сравнивал. Миллион строк с другим миллионом. Вроде есть такое ну или мне тоже приснилось)
Видел, но вот хоть убей, не могу найти ни внутренним поиском, ни гуглом
 

Alelsey1611

Client
Регистрация
18.08.2017
Сообщения
402
Благодарностей
29
Баллы
28

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Только что понял, что для ускорения, нужно и найденную строку из списка удалять, чтоб потом ее опять не проверять с другими строками. Думаю, скорости прибавит, но не сильн
раза в 2
 

Alelsey1611

Client
Регистрация
18.08.2017
Сообщения
402
Благодарностей
29
Баллы
28
А там где нам приснилось, или может нет миллионы строк сравнивались за секунды. Я тоже точно помню что это где-то было. Такую тему надо было сразу в закладки не думая(
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
  • Спасибо
Реакции: Nord и Alelsey1611

Alelsey1611

Client
Регистрация
18.08.2017
Сообщения
402
Благодарностей
29
Баллы
28

Nord

Client
Регистрация
22.03.2012
Сообщения
2 406
Благодарностей
1 473
Баллы
113
Правильно ли я понял, переносим колонку из таблицы и наш список в массивы. Потом этим кодом
C#:
mass2.AsParallel().Except(mass1.AsParallel()).ToArray();
исключаем один массив из другого и на выходе получаем третий массив с тем, что нужно оставить в таблице, а другое удаляем из таблицы.
Хотя опять начал за здравие, а закончил за упокой =)
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Только что понял, что для ускорения, нужно и найденную строку из списка удалять, чтоб потом ее опять не проверять с другими строками. Думаю, скорости прибавит, но не сильно
Что-то я вообще не понял твой код, зачем-то при каждой итерации цикла инициализируется новый список, но не суть)) Попробуй так:
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

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Самый простой вариант создать List<T> и туда пихать таблицу.
 

proffman

Client
Регистрация
24.01.2013
Сообщения
547
Благодарностей
51
Баллы
28
Что-то я вообще не понял твой код, зачем-то при каждой итерации цикла инициализируется новый список, но не суть)) Попробуй так:
Что то я не могу понять что не так в этом коде, вместо списка добавил таблицу еще одну таблицу. Специально сделал все строки дублями во второй таблице, не все строки удаляются. Из 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

sten30

Client
Регистрация
05.09.2017
Сообщения
253
Благодарностей
31
Баллы
28
Что-то я вообще не понял твой код, зачем-то при каждой итерации цикла инициализируется новый список, но не суть)) Попробуй так:
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)