Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/47: Рейтинг темы: голосов - 47, средняя оценка - 4.85
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Убрать уникальные значения в List

22.01.2019, 09:52. Показов 9685. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть
C#
1
2
3
4
5
        public struct S
        {
            public int M;
            public int CRC;
        }
нужно посредством Sort() / foreach / OrderBy() / GroupBy() убрать все уникальные значения по CRC, чтобы остались любые повторяющиеся и можно было прочитать все значения М.
то есть из
C#
1
{ 1, 7, 12, 8, 12, 9, 3, 4, 3, 12, 17, 14, 0 }
нужно получить
C#
1
{ 12, 12, 3, 3, 12 }
я третий день ковыряюсь с Sort() / OrderBy() / GroupBy() и совсем не вкуриваю как они работают.
Из идей была только - сначала с помощью Sort() получить упорядоченную последовательность, а потом в цикле проверять совпадение текущего элемента с предыдущим и если они совпали - обрабатывать их. Но Sort() нет для struct, поэтому пока залип на месте.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2019, 09:52
Ответы с готовыми решениями:

Уникальные значения столбца А по сравнению со столбцом С и уникальные значения в столбце С по сравнению с А?
Ребята всем привет, как реализовать макросом? Есть два столбца А и С в каждом списки наименований.Как вывести в столбцы F и H(либо на...

Перенести значения из одного List<T> в другой List
Добрый вечер, возможно глупы вопрос, но он привел меня в замешательство. Как копировать значения одного List&lt;T&gt; в другой...

Уникальные значения
Приветствую, есть таблица с 6 столбцами, нужно выбрать все 6 столбцов,но только те данные, где в пером столбце уникальные значения как...

73
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.01.2019, 13:08  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это не важно - будет работать с любой последовательностью.
как с этим работать?
IEnumerable<S> listS = .....; // входная последовательность.
у меня есть
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        public unsafe struct DimBitsS
        {
            public byte[] Bits;
            public byte[] Matrix;
            public int Sum;
            public ulong Hash64;
 
            public DimBitsS(int _Sum, byte[] bits, byte[] matrix)
            {
                this.Sum = _Sum;
                this.Bits = bits;
                this.Matrix = matrix;
                this.Hash64 = 0;
            }
        }
 
public static DimBitsS[] DimBitsSN = new DimBitsS[1048576];
такой вариант не работает
C#
1
2
3
                    var groupList = DimBitsSN.GroupBy(s => s.Hash64);
                    var uniqueCRC = groupList.When(gr => gr.Count() == 1).Select(gr => gr.Key).ToList();
                    var notUniqueS = DimBitsSN.When(s => uniqueCRC.IndexOf(s.Hash64) < 0);
Добавлено через 3 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Ну или отсеивать еще на уровне считывания из файла.
их нет ни в каком файле, нули созданы вашим кодом. Мои хэши генерируются в ходе итераций цикла, потом циклом Parallel.For() я проверял все хэши сравнивая "каждый с каждым", на выходе был файл с 4224 элементами. Нулей там нет и не было никогда. Файл с нулями это результат работы вашего кода, а не моего.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.01.2019, 13:09
Цитата Сообщение от belalugoci Посмотреть сообщение
у меня есть
Я же сразу написал для ТЗ в начале темы.
Почитаю посты дальше, если разберусь напишу.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.01.2019, 13:18  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
достаточно
вопрос по запросу
C#
1
var q = DimBitsSN.GroupBy(x => x.Hash64).Where(g => g.Key > 0 && g.Count() > 1).SelectMany(g => g);
на каком этапе появляется соответствие поля структуры Hash64 и g.Key?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.01.2019, 13:19
Цитата Сообщение от belalugoci Посмотреть сообщение
Файл с нулями это результат работы вашего кода, а не моего.
В моем коде нигде не присваивается значение — там только выборка, потому нет, косяк где-то на вашей стороне.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.01.2019, 13:26
Цитата Сообщение от belalugoci Посмотреть сообщение
такой вариант не работает
Блин! Описка! Вот так попробуйте
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            var notUniqueGroup = DimBitsSN.GroupBy(d => d.Hash64).Where(gr => gr.Count() > 1); // Получение последовательности групп с неуникальными Hash64
            int count = notUniqueGroup.Count(); // Количество неуникальных групп
 
            // Обработка результата
            foreach (var gr in notUniqueGroup) // Цикл по неуникальным группам
            {
                ulong hash64 = gr.Key; // Неуникальный Hash64
                foreach (var d in gr) // Цикл по елементам группы
                {
                    // Получение полей элементов
                    byte[] bits = d.Bits;
                    byte[] matrix = d.Matrix;
                    int sum = d.Sum;
                }
            }
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.01.2019, 13:29  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
В моем коде нигде не присваивается значение — там только выборка, потому нет, косяк где-то на вашей стороне.
Запускаю:
C#
1
2
3
4
5
For(dimIdxStart, dimIdxEnd, y =>
{
    if (Hash64 == 0)
        countIn++;
});
получаю результат
Hash64==0 -> count 0
То есть за время работы программы ни разу не появляется значение Hash64 равное нулю. И это логично.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.01.2019, 13:32
Цитата Сообщение от belalugoci Посмотреть сообщение
за время работы программы ни разу не появляется значение Hash64 равное нулю.
Да, потому что вы проверяете одну и ту же переменную (dimIdxEnd - dimIdxStart) раз, а не значение хэша в массиве по индексу y.
0
HF
 Аватар для HF
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,749
Записей в блоге: 2
23.01.2019, 13:37
Цитата Сообщение от belalugoci Посмотреть сообщение
Не понял вашей шутки. Нулей нет вообще в исходных данных, они появляются на этапе выборки в q, поэтому их попадание в результат никак не может считаться правильным.
Это что? Нули или Ноли?
Цитата Сообщение от bits0.7z
...
0
0
10003100934026669581
10003100934026669581
10016792268759489757
10016792268759489757
100265518841258890
100265518841258890
10027759587515715072
...
Я тогда вообще не понимаю смысла этого файла, если это не данные для q.Hash64. Хотя по количеству всё сошлось с условиями.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.01.2019, 13:48  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Да, потому что вы проверяете одну и ту же переменную (dimIdxEnd - dimIdxStart) раз, а не значение хэша в массиве по индексу y.
Это не имеет значения
C#
1
2
3
4
5
using YYProject.XXHash;
DimBitsSN[tempIndex] = new DimBitsS(SumBits, bitsArray, matrixArray);
ref DimBitsS dimBits = ref DimBitsSN[tempIndex];
xxHash.ComputeHash(bitsArray);
Hash64 = dimBits.Hash64 = xxHash.HashUInt64;
потому что DimBitsSN[y].Hash64 это прошлые Hash64. Специально заменил код и посчитал - нет нулей.

Цитата Сообщение от HF Посмотреть сообщение
Это что? Нули или Ноли?
Это данные находящиеся в q, я выгрузил их в файл и показал, что в результате работы выборки появляются нули, которых нет в исходных данных.

Цитата Сообщение от HF Посмотреть сообщение
Я тогда вообще не понимаю смысла этого файла, если это не данные для q.Hash64. Хотя по количеству всё сошлось с условиями.
Это данные не для q - это результат работы q.
0
HF
 Аватар для HF
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,749
Записей в блоге: 2
23.01.2019, 13:54
Цитата Сообщение от belalugoci Посмотреть сообщение
Это данные находящиеся в q, я выгрузил их в файл и показал, что в результате работы выборки появляются нули, которых нет в исходных данных.
Это данные не для q - это результат работы q.
Дак дайте входящие данные. Как можно понять причину если мы знаем только результат. И вы ещё не можете понять, почему мы не понимаем того что вы хотите.

Если это был результат на основании ваших предыдущих ошибок, то значит наш вышенаписанный фильтр должен это исправить и нолей точно не должно быть.

Сейчас то есть проблема?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.01.2019, 13:56
Цитата Сообщение от belalugoci Посмотреть сообщение
это результат работы q.
Это физически не может быть результатом работы выборки — на то она и выборка, изначальные значения она вообще никак не меняет.
Косяк где-то у вас.
Если q выдает данные с нулями, значит на входе были эти данные.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.01.2019, 13:56  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Блин! Описка! Вот так попробуйте
Ваш код тоже генерирует нулевые значения хешей, которых нет в исходных данных.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.01.2019, 13:59
Цитата Сообщение от belalugoci Посмотреть сообщение
которых нет в исходных данных.
Есть.
Если значений нет в исходных данных, то их не может быть в выходных данных.
1
HF
 Аватар для HF
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,749
Записей в блоге: 2
23.01.2019, 14:14
Цитата Сообщение от kolorotur Посмотреть сообщение
Если значений нет в исходных данных, то их не может быть в выходных данных.
Да полюбому может быть. Я же сразу спросил - как формируется массив DimBitsSN. Он эти хэши ещё как-то делает, или из битов или ещё что-то. В итоге ulong заполняется 0 в случае если данных нет.

Добавлено через 4 минуты
Цитата Сообщение от belalugoci Посмотреть сообщение
using YYProject.XXHash;
DimBitsSN[tempIndex] = new DimBitsS(SumBits, bitsArray, matrixArray);
ref DimBitsS dimBits = ref DimBitsSN[tempIndex];
xxHash.ComputeHash(bitsArray);
Hash64 = dimBits.Hash64 = xxHash.HashUInt64;
Что это? когда это вызывается? зачем?
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
23.01.2019, 14:25
Цитата Сообщение от belalugoci Посмотреть сообщение
Ваш код тоже генерирует нулевые значения хешей, которых нет в исходных данных.
Он, вообще, ничего не генерирует. Он только группирует и фильтрует. Он может не показать данные которые есть (если их фильтр не пропустил), но не может создать новые данные.
1
95 / 74 / 27
Регистрация: 13.08.2018
Сообщений: 203
23.01.2019, 15:00
Видать ТС фильтрует массив до его полного заполнения , отсюда и нули. Возможно нет понимания того, что массив структур сразу создает пустые объекты.
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
23.01.2019, 15:22  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
как формируется массив DimBitsSN
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Он, вообще, ничего не генерирует
Цитата Сообщение от maximka777 Посмотреть сообщение
Видать ТС фильтрует массив до его полного заполнения , отсюда и нули
покорнейше прошу у вас прощения за свою глупость. Я отталкивался от ошибочной предпосылки. Нули действительно имеют место быть. Связано это с тем, что массив
C#
1
public static DimBitsS[] DimBitsSN = new DimBitsS[1048576];
имеет фиксированный размер, а данные в нём распределены интервалами dimIdxStart и dimIdxEnd, которые не всегда граничат друг с другом. В моей реализации я изначально работаю с интервалами, в вашей же работа всегда ведётся со всем массивом данных.
В другой теме maximka777 учёл такой подход, но я не понимал что именно он делает:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            foreach (var group in ranges.GroupBy(x => x.Begin))
            {
                int i = group.Key;
 
                ulong[] data = new ulong[1 << 16];
 
                foreach (var item in group.OrderBy(x => x.End))
                {
                    for (; i < item.End; i++)
                    {
                        data[DimBitsSN[i].zip]++;
                    }
                    countIn += data[item.Zip];
                }
            }
так как код мне непонятен был, то я не принял ко вниманию его, а с вашей помощью стал понимать этот вариант. То есть в моём случае как раз нужно иметь структуру ranges в которой хранить все интервалы для работы (ну или тогда отсеивать нули).
Спасибо что позволили найти ошибки и разобраться.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
24.01.2019, 05:55  [ТС]
благодаря вашей помощи (в том числе и maximka777) написал вот такую финальную обработку:
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
public class cRanges
        {
            public int Begin, End, Count;
            public cRanges(int begin, int end, int count)
            {
                Begin = begin;
                End = end;
                Count = count;
            }
 
            public override string ToString()
            {
                return $"{Begin} : {End} : {Count}";
            }
        }
        public static List<cRanges> Ranges = new List<cRanges>();
 
               int Sum = 0;
                    for (var i = 1; i < 20; i++)
                    {
                        if (DimIdx[i] < countNidx[i])
                        {
                            Ranges.Add(new cRanges(DimIdx[i], countNidx[i] - 1, countNidx[i] - DimIdx[i]));
                            Sum += Ranges.Last().Count;
                            strout.Add(Ranges.Last().ToString());
                        }
                    }
 
                    var q = DimBitsSN.GroupBy(x => x.Hash64)
                            .Where(g => g.Count() > 1)
                            .SelectMany(g => g)
                            .ToArray();
                    int temp_i = 0;
                    int qLen = q.Length;
                    for (int i = 0; i < qLen; )
                    {
                        temp_i = i + 1;
                        if (temp_i < qLen)
                        {
                            while (q[i].Hash64 == q[temp_i].Hash64)
                            {
                                strout.Add(q[i].Hash64.ToString() + " : " + q[temp_i].Hash64.ToString());
                                temp_i++;
                                if (temp_i >= qLen) break;
                            }
                        }
                        i = temp_i;
                    }
в первой части собирается список интервалов, во второй (пока без их применения) идёт перебор пар. То есть всё что нужно для обработки результата. Теперь открытым остается только вопрос с тем, как интервалы в Ranges прикрутить к var q.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
29.01.2019, 09:23  [ТС]
Вопрос: почему все же конструкция
C#
1
2
3
4
                    var q = DimBitsSN.GroupBy(x => x.Hash64)
                            .Where(g => g.Count() > 1)
                            .SelectMany(g => g)
                            .ToArray();
работает очень быстро? Ведь если бы требовалось много памяти, ну Ок, но ведь не требуется, значит по одним и тем же данным бегают туды-сюды, а разница в скорости в сотни раз меньше.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.01.2019, 10:15
Цитата Сообщение от belalugoci Посмотреть сообщение
значит по одним и тем же данным бегают туды-сюды
Данные обходятся ровно два раза: один раз для группировки, второй — для выборки.
Во время выполнения ToArray данные могут копироваться в более большой массив при расширении, но это тупое копирование памяти — очень быстрая операция.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.01.2019, 10:15

Уникальные значения
Здравствуйте. Вопрос по C#. У меня есть список (list) техники (Принтер, монитор и тд.). Так как я считываю данные из файла и неизвестно что...

Уникальные значения
Здравствуйте, подскажите пожалуйста: есть таблица с огромным количеством данных, мне необходимо в запросе отбирать уникальные значения по...

Уникальные значения в БД
Люди подскажите каким способом можно отлавливать ошибки в коде? когда допустим добавляешь значение в базу, а там уже есть такое значение и...

Excel найти уникальные значения из первого столбца и фильтровать - не брать пустые значения из 3 столбца
Ребят, помогите осуществить в коде VB в Excel. Сделал в самом доке, а как в коде на VB новичок. Нужно найти уникальные записи из первого...

DBLookupComboBox Уникальные значения
У меня есть DBLookupComboBox можно ли внем выводить только уникальные значения? Может свойство какое есть? Я не нашел Добавлено...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru