|
10 / 10 / 7
Регистрация: 29.08.2014
Сообщений: 84
|
||||||
Убрать повторения объекта без использования LINQ02.11.2016, 16:12. Показов 3252. Ответов 15
Метки нет (Все метки)
Здравствуйте, подскажите пожалуйста мне как можно убрать повторяющиеся значения в объекте...
к примеру есть список студентов с фамилией, годом рождения, и например факультетом и я хочу вывести какие факультеты есть из этого списка при этом чтобы они не повторялись я написал группировку с помощью LinQ
вопрос как это можно сделать без LinQ?
0
|
||||||
| 02.11.2016, 16:12 | |
|
Ответы с готовыми решениями:
15
Linq без использования FrameWork 3.5 Переписать код без использования LINQ to XML без использования invoke (убрать процедуру) |
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||||||||||||
| 02.11.2016, 16:42 | |||||||||||||||||
Заметил, что вы в запросе выбираете ключ группировки. В таком случае, второй метод можно переписать так:
1
|
|||||||||||||||||
|
|
|||||||
| 02.11.2016, 16:45 | |||||||
1
|
|||||||
|
.NET senior
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
|
||||||
| 02.11.2016, 20:46 | ||||||
|
FastTI, вариант с прямым созданием HashSet<string> (на мой взгляд, он самый быстрый):
2
|
||||||
|
10 / 10 / 7
Регистрация: 29.08.2014
Сообщений: 84
|
|||||||||||
| 03.11.2016, 11:06 [ТС] | |||||||||||
|
kolorotur, diadiavova, Спасибо вам за помощь, я воспользуюсь вашими советами...
я не много не понимаю работы IEnumarable<> diadiavova, ваш пример
обязательно использовать этот интерфейс и в чем принципиальная разница в использовании List<int> или IEnumerable<int>...
0
|
|||||||||||
|
|
|||
| 03.11.2016, 11:12 | |||
|
1
|
|||
|
0 / 0 / 0
Регистрация: 02.11.2016
Сообщений: 1
|
|
| 03.11.2016, 11:21 | |
|
IEnumerable более "обобщенный"
![]() у List есть методы для обработки кписка
0
|
|
|
10 / 10 / 7
Регистрация: 29.08.2014
Сообщений: 84
|
|
| 03.11.2016, 11:40 [ТС] | |
|
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 03.11.2016, 12:07 | |
|
FastTI, на всякий случай: обратите внимание, что в решении, предложенном товарищем diadiavova, при каждой проверке происходит полный обход промежуточного списка, что дает сложность алгоритма O(n2).
Вариант товарища bax_tang работает со сложностью O(2n), т.к. сначала факультеты копируются в хэш, а потом в массив. Мой вариант работает со сложностью O(n). Вариант товарища bax_tang можно улучшить, если вместо string[] возвращать IEnumerable<string> и отдавать сгенерированный хэшсет, тем самым устраняя копирование всех элементов в массив. Тогда наши алгоритмы будут одинаковы с той разницей, что вариант товарища bax_tang делает полный обход списка в любом случае, а мой вариант выплевывает элементы по-одному, в процессе обхода списка.Если всегда нужна фильтрация всего списка, то они идентичны, но если нужна только часть (например, если нужны только первые 5 уникальных факультетов), то мой вариант будет эффективнее.
1
|
|
|
|
|
| 03.11.2016, 12:32 | |
|
kolorotur, пара замечаний. Изначально использовать хешсет я не стал из-за того, что вопрос был о реализации алгоритма без использования линк. Причина, по которой было выдвинуто такое условие мне неизвестна и это вполне могла быть необходимость реализации под второй фреймворк, например, в котором никакого хешсета не было и в помине. Нельзя сказать, что там его нечем заменить, поскольку можно, например использовать Dictionary, в котором ключи организованы по тому же принципу, что и хешсет, так что из него вполне себе возможно было соорудить костыль. Но вот о чем я подумал: выигрыш в производительности скорей всего будет незначительным и на малых списках его, скорей всего вообще заметить будет невозможно. Кроме того скорость поиска в коллекциях типа хешсета увеличивается совсем не бесплатно, они организованы по принципу двоичного дерева поиска, а это дерево дает такой эффект только в том случае, если оно сбалансировано. Балансировка дерева - тоже штука не бесплатная. Таким образом, там где обычный список теряет на поиске, хешсеты всякие будут терять на добавлении новых элементов. В результате, если список студентов будет внушительным, а список факультетов получится маленьким, то, очевидно использование хешсета даст вполне диагностируемый прирост производительности, поскольку там будет небольшое количество добавлений, насчет остальных случаев - я совсем не уверен. Ответ может дать только серьезный тест и у меня есть подозрение, что в любом случае это будет "экономия на спичках".
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 03.11.2016, 12:47 | |||||
![]() Разумеется, если метод вызывается раз в год на десяти элементах, то особо мудрить с оптимизациями смысла не имеет. С другой стороны, разница между использованием списка и хэшсета — ровно одна строчка: заменить new List<string>() на new HashSet<string>(), потому особо не мудрствуя о возможных размерах списка, можно сразу написать "на вырост" и забыть
0
|
|||||
|
|
||||||
| 03.11.2016, 13:25 | ||||||
|
1
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 03.11.2016, 13:38 | |||||
|
В List<T> — то же самое, потому я этот момент "вынес за скобки". ![]() HashSet использует хэш-таблицу, где место хранения высчитывается на основании значения метода GetHashCode элемента. Элементы с совпадающими хэшами хранятся в списке, потому сложность поиска будет зависить от качества реализации метода GetHashCode элементов. Если они все будут возвращать один и тот же хэш, то поиск будет O(n), как в обычном массиве, а если в классе реализована идеальная хэш-функция, то поиск будет всегда O(1).
1
|
|||||
|
10 / 10 / 7
Регистрация: 29.08.2014
Сообщений: 84
|
|||
| 04.11.2016, 18:55 [ТС] | |||
|
kolorotur, diadiavova, Спасибо вам за подробное обсуждение! Осталось только переварить)
Добавлено через 6 минут
0
|
|||
|
|
|
| 04.11.2016, 19:01 | |
|
FastTI, дык kolorotur же ссылки дал на документацию по методам.
0
|
|
|
10 / 10 / 7
Регистрация: 29.08.2014
Сообщений: 84
|
|
| 11.11.2016, 21:50 [ТС] | |
|
diadiavova, прошу прощения... не увидел
0
|
|
| 11.11.2016, 21:50 | |
|
Помогаю со студенческими работами здесь
16
Отслеживание сессии юзера без использования объекта Session Как убрать raid с винчестеров без использования биоса
Удаление реквизита объекта без проверки использования в других объектах Запуск экземпляра СОМ объекта с другой машини без использования IIS Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|