удалить дубликаты в датированном - PullRequest
1 голос
/ 10 марта 2011

У меня есть следующая реализация, чтобы найти дубликаты в DataTable.Это крайне неэффективно и занимает около 20 тысяч строк.Мне нужно только найти повторяющиеся записи для значений второго столбца:

private List<string> checkForDuplicates(DataTable results)
{
    List<string> duplicateLists = new List<string>();
    for (int i = 0; i < results.Rows.Count; i++ )
    {
        string cellvalue = results.Rows[i][1].ToString();
        for (int j = 0; j < results.Rows.Count; j++)
        {
            if (i != j)
            {
             if (cellvalue.Equals(results.Rows[j][1]))
                {
                    //Duplicate found                            
                    duplicateLists.Add(results.Rows[i][1].ToString() + "_" + i+2 + "_" + j+2);
                }
            }
        }

    }
    return duplicateLists;
}

Ответы [ 5 ]

1 голос
/ 10 марта 2011

Используйте словарь, итерируйте один раз по всем значениям и подсчитайте вхождение каждого значения => Ключ словаря - это значение столбца, значение словаря - это счет. Затем верните все ключи, число которых больше одного.

1 голос
/ 10 марта 2011

Одна оптимизация, которую вы можете сделать, - это выполнить дедупликацию отсортированного набора данных. Определите DataView, который сортирует данные в соответствующем столбце, а затем просто проверьте, что значение текущей строки не совпадает со значением предыдущей строки.

Ответ Марка Совула, возможно, будет лучшей идеей, если вас не беспокоит физическое удаление строк.

1 голос
/ 10 марта 2011

Проблема, с которой вы столкнулись, заключается в том, что каждая строка должна проверять каждую вторую строку, поэтому при увеличении количества строк количество проверок увеличивается в геометрической прогрессии.Самый быстрый способ справиться с этим - сделать его линейным - выполнить столько проверок, сколько строк.

Один из способов сделать это - отсортировать таблицу данных по столбцу 2.Это поместит любые дубликаты в соседние строки, поэтому вам нужно просто просмотреть таблицу, чтобы убедиться, что одна строка не совпадает со следующей.

Другой способ - получить данные в источнике и убедитьсястроки различаются до того, как вы их прочитаете.

0 голосов
/ 10 марта 2011

SQL был бы гораздо более эффективным способом сделать это, чем дважды извлекать весь набор данных.

Вы можете сделать это очень быстро, если у вас есть индекс для столбца, на который вы ссылаетесь.

Просто сделай

SELECT id AS matchID, column1 FROM table1 WHERE column1 IN (SELECT column1 FROM table1 WHERE id IS NOT matchId)

или что-то в этом роде

Ура, Нико

0 голосов
/ 10 марта 2011

От: http://social.msdn.microsoft.com/Forums/en/adodotnetdataset/thread/ed9c6a6a-a93e-4bf5-a892-d8471b84aa3b

DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);

Для ваших целей вы можете создать DataView, включающий только те столбцы, которые вам интересны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...