Удаление дубликатов в таблице по столбцу (улучшить код)

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 553
Баллы
113
Использую код для удаления дублей в таблице по определенному столбцу:
Код:
var t = project.Tables["Таблица"];
var c = 3;
for(int i=0; i<t.RowCount-1; i++){
    var s = t.GetCell(c, i);
    for(int j=0; j<t.RowCount; j++){
        if(i!=j&&t.GetCell(c, j)==s){
            t.DeleteRow(j--);
            i--;
        }
    }
}
Но на больших объемах всё печально, может затянутся на 10-20-... минут
Может есть более изящный и "правильный вариант"?
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
через словарь словарей ( ну или списков) попробуйте. это позволит сделать алгоритм однопроходным, что в свою очередь его ускорит в некисло так раз.
Но правда если вы в шарпе не разбираетесь, то закажите кому нибудь. Тут нынче полно селлеров и не думаю что у кого то вызовет сложности такая ерунда
 
  • Спасибо
Реакции: ibred

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 553
Баллы
113
через словарь словарей ( ну или списков) попробуйте.
Готового решения не прошу, подскажите просто, что за "словарь словарей" вкратце. Буду очень признателен!)

UPD: это функция Distinct()?
 
Последнее редактирование:

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
что такое словарь
http://professorweb.ru/my/csharp/charp_theory/level12/12_10.php
а словарь словарей - это когда по каждому ключу вместо какого то значения лежит еще один словарь.
т.е. если представить таблицу из четырех строк и трех колонок

1 A 1A
2 A 2A
3 B 3B
1 A 4A


то в виде словаря словарей это было бы похоже на такую структуру

dct:
---- [1]
---------[A]
--------------[1A]
--------------[4A]
---- [2]
---------[A]
--------------[2A]
---- [3]
---------B
--------------[3B]

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

dct:
---- [A]
---------[(1, 1A),
----------(2, 2A),
----------(1, 4A)]
---- B
---------[(3, 3B)]

ну и в зависимости от сложности таблицы дальше эту структуру можно ветвить и в зависимости от исходных данных, задач и хз чего еще можно её динамически менять, получать количество элементов по ключу и т.п.
 
  • Спасибо
Реакции: CSS, ibred и evgen_po

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
В общем задача совсем простая - удалить строку если значение в данной колонке уже встречалось. По сути не далеко ушло от обычного черного списка. Просто добавляем каждую новую строчку в контрольный список, и если такая строчка там уже есть - то чпокаем строку
Код:
var t = project.Tables["Таблица"];
var c = 3;
List<string> lst = new List<string>();
for(int i=t.RowCount-1; i>=0; i--){
    var s = t.GetCell(c, i);
    if (lst.Contains(s))
    {
        t.DeleteRow(i);
    }
    else
    {
        lst.Add(s);
    }
}
Код правил в блокнотике - так что возможны сюрпризы)))
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 553
Баллы
113
В общем задача совсем простая - удалить строку если значение в данной колонке уже встречалось. По сути не далеко ушло от обычного черного списка. Просто добавляем каждую новую строчку в контрольный список, и если такая строчка там уже есть - то чпокаем строку
Просто огонь!
"Чпокает" моментально :-)

Огромное спасибо!
 

Lexicon

Client
Регистрация
27.12.2012
Сообщения
1 775
Благодарностей
901
Баллы
113
Присоединяйтесь к котоаватарцам!))))
 
  • Спасибо
Реакции: APXOHT

baimkin

Client
Регистрация
04.08.2015
Сообщения
283
Благодарностей
111
Баллы
43
я тож присоединюсь к котикам, за такие то клевые решения
 
  • Спасибо
Реакции: Lexicon

Kaspian

Client
Регистрация
23.12.2013
Сообщения
93
Благодарностей
132
Баллы
33
В общем задача совсем простая - удалить строку если значение в данной колонке уже встречалось. По сути не далеко ушло от обычного черного списка. Просто добавляем каждую новую строчку в контрольный список, и если такая строчка там уже есть - то чпокаем строку
Код:
var t = project.Tables["Таблица"];
var c = 3;
List<string> lst = new List<string>();
for(int i=t.RowCount-1; i>=0; i--){
    var s = t.GetCell(c, i);
    if (lst.Contains(s))
    {
        t.DeleteRow(i);
    }
    else
    {
        lst.Add(s);
    }
}
Код правил в блокнотике - так что возможны сюрпризы)))
Подскажите, а как сделать, чтобы удалялись не дубли, а брались строки из отдельного списка и проверялись на присутствие в нужном столбце, в случае совпадения удалялась вся строка из таблицы?
 

Kaspian

Client
Регистрация
23.12.2013
Сообщения
93
Благодарностей
132
Баллы
33
Подскажите, а как сделать, чтобы удалялись не дубли, а брались строки из отдельного списка и проверялись на присутствие в нужном столбце, в случае совпадения удалялась вся строка из таблицы?
Вроде разобрался, быстрее чем на кубиках, но все равно не быстро.
Как-то так вроде, если кому вдруг понадобится
Код:
var lst = project.Lists["Список"];
var t = project.Tables["Таблица"];
var c = 0;
for(int i=t.RowCount-1; i>=0; i--){
    var s = t.GetCell(c, i);
    if (lst.Contains(s))
    {
        t.DeleteRow(i);
    }
}
 

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