Аватар для mih08
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 87

Удаление дубликатов

08.03.2014, 21:10. Показов 5198. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть таблица в DataGridview с 3 столбцами.
Как сделать удаление повторяющихся строк(ячейки равны по всем 3 столбцам)?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.03.2014, 21:10
Ответы с готовыми решениями:

Удаление дубликатов с массива
Добрый день! подскажите плиз как с массива типа List<string> удалить повторяющие строки. public List<string> lst = new...

Удаление дубликатов в массиве через цикл
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { ...

Удаление дубликатов листа с наименьшими затратами памяти
Distinct выделяет доп память. он не подходит. Нужно чтобы дубликат удалялся в том же листе я думаю. Что-то очевидное делать не захотел....

12
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
08.03.2014, 21:13
mih08, какой источник данных у DataGridView?
0
 Аватар для mih08
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 87
08.03.2014, 21:17  [ТС]
В ручную заполняется
0
44 / 44 / 8
Регистрация: 06.02.2014
Сообщений: 233
08.03.2014, 21:24
Тебе нужно удалять именно повторяющиеся строки или ячейки?
Если сроки, то сделай цикл по всему Grid-у и сравнивай значение первой, второй и третьей ячеек данной строки с предыдущей, если совпали, то очищаешь строку, в цикле с данной до конца перекидываешь строки вверх на одну и устанавливаешь значение count = count-1
1
 Аватар для mih08
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 87
08.03.2014, 21:28  [ТС]
Да по строкам, не ужели нет более лучшего решения?
Ведь перебирать всю таблицу, сравнивая все значения затратно.
Таблица парсинга и соответственно много дубликатов.
0
44 / 44 / 8
Регистрация: 06.02.2014
Сообщений: 233
08.03.2014, 21:31
Цитата Сообщение от mih08 Посмотреть сообщение
Да по строкам, неужели нет более лучшего решения?
Ведь перебирать всю таблицу сравнивая все значения затратно.
В любом случае надо цикл делать, иначе как ты по всей таблице пройдёшь?
А на счёт затратности. Я не думаю, что нынешнему компьютеру с ТЧ > 3ГГц будет сложно сделать это с такой простой таблицей
1
 Аватар для mih08
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 87
08.03.2014, 21:32  [ТС]
Хорошо, спасибо =)
0
Заблокирован
08.03.2014, 22:07
Цитата Сообщение от Worf Посмотреть сообщение
А на счёт затратности. Я не думаю, что нынешнему компьютеру с ТЧ > 3ГГц будет сложно сделать это с такой простой таблицей
Из за таких как вы у меня игры лагают
1
44 / 44 / 8
Регистрация: 06.02.2014
Сообщений: 233
08.03.2014, 22:09
Цитата Сообщение от ICanHelpU Посмотреть сообщение
Из за таких как вы у меня игры лагают
Ну, цикл по таблице-это ещё не процесс рассчёта траектории движения персонажа на сервере онлайн игры, так что не надо сравнивать степень затрачиваемых рес-ов на данную операцию
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
08.03.2014, 22:10
Лучший ответ Сообщение было отмечено mih08 как решение

Решение

Решение. Создаете класс с тримя полями нужного типа. Переопределяете .GetHashCode() и .Equals(). В качестве источника данных устанавливаете коллекцию этих элементов. Когда нужно будет удалить дубликаты создадите HashSet<T> и присвоите в качестве источника данных DataGridView уже этот HashSet<T>.
1
foo();
 Аватар для rattrapper
886 / 587 / 222
Регистрация: 03.07.2013
Сообщений: 1,549
Записей в блоге: 2
08.03.2014, 22:14
mih08, вот вроде рабочий вариант, и со скоростью неплохо
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void Clear(DataGridView table)
{
    int c = table.Columns.Count;
    HashSet<object>[] data = new HashSet<object>[table.Columns.Count];
    for (int i = 0; i < c; i++)
        data[i] = new HashSet<object>();
    foreach (DataGridViewRow r in table.Rows)
    {
        bool delete = true;
        for (int i = 0; i < c; i++)
            delete = data[i].Add(r.Cells[i].Value) ? false : delete;
        if (delete) table.Rows.Remove(r);
    }
}
Добавлено через 2 минуты
нет, это не правильно
0
44 / 44 / 8
Регистрация: 06.02.2014
Сообщений: 233
08.03.2014, 22:16
Да, что напрягаться, в любом случае придётся тратиться на время сравнения записей, как иначе?
Как бы динамично что не создавалось, а цикл - это цикл
Эта тема уже обсуждалась на другом форуме, где я опять таки указывал на неизбежность потерь времени и ресурсов
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
08.03.2014, 22:31
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Collections.Generic;
using System.Windows.Forms;
 
namespace Ghost
{
    public class DataGridViewRowComparer : IEqualityComparer<DataGridViewRow>
    {
        public bool Equals(DataGridViewRow x, DataGridViewRow y)
        {
            if (ReferenceEquals(x, null))
            {
                return false;
            }
 
            if (ReferenceEquals(y, null))
            {
                return false;
            }
 
            if (x.Cells.Count != y.Cells.Count)
            {
                return false;
            }
 
            if (x.State != y.State)
            {
                return false;
            }
 
            for (int i = 0; i < x.Cells.Count; i++)
            {
                object xValue = x.Cells[i].Value;
                object yValue = y.Cells[i].Value;
                if (xValue == null && yValue == null)
                {
                    continue;
                }
                if (xValue == DBNull.Value && yValue == DBNull.Value)
                {
                    continue;
                }
                try
                {
                    if (xValue.GetHashCode() != yValue.GetHashCode() ||
                        !xValue.Equals(yValue))
                    {
                        return false;
                    }
                }
                catch
                {
                    return false;
                }
            }
 
            return true;
        }
 
        public int GetHashCode(DataGridViewRow obj)
        {
            int hash = 0;
            for (int i = 0; i < obj.Cells.Count; i++)
            {
                if (obj.Cells[i].Value != null &&
                    obj.Cells[i].Value != DBNull.Value)
                {
                    hash ^= obj.Cells[i].Value.GetHashCode();
                }
            }
            return hash;
        }
    }
}
C#
1
2
3
4
5
6
7
8
private void button1_Click(object sender, EventArgs e)
{
    HashSet<DataGridViewRow> rows = new HashSet<DataGridViewRow>(
        dataGridView1.Rows.OfType<DataGridViewRow>().Where(x => !x.IsNewRow),
        new DataGridViewRowComparer());
    dataGridView1.Rows.Clear();
    dataGridView1.Rows.AddRange(rows.ToArray());
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.03.2014, 22:31
Помогаю со студенческими работами здесь

Коллекция без дубликатов
Здравствуйте. Возник вопрос: мне нужно сделать коллекцию (т.е. динамический массив), но в нем не должно содержаться дубликатов, потому что...

Сохранение без дубликатов
При сохранении надо поставить проверку, имеется ли в файле строки, которые будут сохранены. Сохранение происходит из listBox. string...

Поиск дубликатов без LINQ
Есть список объектов класса Class1. public class Class1 { public int Num; //номер по порядку public string ID;...

Быстрый поиск дубликатов строк
Есть большой файл (3,5 миллиона записей). Нужно быстро найти все дубликаты строк и вывести индексы/как-то их сохранить. Прямой поиск...

Поиск одинаковых (дубликатов) значений в файле
Нужен код для выявления одинаковых дублирующихся значений в текстовом файле. Например текстовый файл: q1q1q1w2w2w2 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru