1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
|
|||||||||||||||||||||
1 | |||||||||||||||||||||
Сортировка List<T> по разным параметрам04.05.2009, 20:37. Показов 76968. Ответов 22
Метки нет (Все метки)
Здравствуйте у меня такой вопрос я создал класс с тремя полями данных разного типа
полям данных , _name, _size,_dateCreation. Заранее благодарю Добавлено через 3 часа 40 минут 57 секунд разобрался с данной проблемой слудующим образом.в этом классе создал статичекий метод для сравнения
Может у кого еще есть примеры решения данной проблемы милости просим.
2
|
04.05.2009, 20:37 | |
Ответы с готовыми решениями:
22
Сортировка по нескольким параметрам в List<T> Сортировка ( List<T>.Sort(...) ) сразу по двум параметрам Запрос с отдельными столбцами по разным параметрам Сравнить в Excel две таблицы по разным параметрам |
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
|
||||||
04.05.2009, 20:42 | 2 | |||||
Сообщение было отмечено SatanaXIII как решение
Решение
если public свойства, то
5
|
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
|
||||||
04.05.2009, 22:07 [ТС] | 3 | |||||
Можете прокоментировать, пожалуйста.
Добавлено через 1 минуту 38 секунд что значит
0
|
MCSD: APP BUILDER
8794 / 1073 / 104
Регистрация: 17.06.2006
Сообщений: 12,602
|
||||||
04.05.2009, 23:21 | 4 | |||||
Sergei,
это лямбда-функция. доступно в c# 3.0 в "старом" стиле этот же код можно переписать так:
2
|
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
|
|
05.05.2009, 08:18 | 5 |
Sergei, как вариант можно создать наследника от IList<T>. И у него реализовать нужные методы для сортировки.
1
|
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
|
|
05.05.2009, 11:12 [ТС] | 6 |
Green то есть вы имеете ввиду перегрузить методы для сортировки или просто свои?
если можно примерчик.
0
|
Smart is the new Sexy
32 / 32 / 1
Регистрация: 29.12.2008
Сообщений: 109
|
|
05.05.2009, 22:47 | 7 |
Для того, чтобы сортировать по различным критериям необходимо создать для этого отдельный тип, который будет наследовать интерфейс IComparer. И в нем можно реализовать несколько сортировок.
Читаем msdn: http://msdn.microsoft.com/ru-r... parer.aspx
1
|
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
|
|
06.05.2009, 04:47 | 8 |
Добавить свои. Способ не очень удобен, если у вас один класс. Т.к. необходимо реализовать весь функционал листа, ради трех сортировок. Намного быстрее или использовать делегаты как у вас, или написать компараторы, как предлагает Del_Piero_10.
Еще как вариант, для каждого экземпляра класса завести доп. свойство указывающее на способ его сортировки. Тогда можно обойтись реализацией интерфейса IComparable, в которой бы сравнение проводилось с учетом этого поля.
1
|
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
|
|
06.05.2009, 10:17 [ТС] | 9 |
То есть чтоб это поле указывало по какое полю данных сортировать список?
0
|
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
|
|
07.05.2009, 05:43 | 10 |
0
|
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
|
|
13.07.2009, 19:54 | 11 |
Sergei, хоть тема немного уже и старовата, да всавлю свои 5 копеек, тем более, что, ИМХО, мое решение немного необычно .
Не по теме: Немного о том, как появилась идея. В неотсортированных списка быстрого поиска не сделаешь, а сортировать список каждый раз перед поиском еще хуже. В стандартной библиотеке C# есть аналог сортированного списка, но он может сортировать только по одному полю. Ничего похожего для мультиполей я не нашел, правда в процессе нагугливания я нашел этот форум . А потом меня осенило, я вспомнил как достигается быстрый поиск в базах данных (до геймдева я 4 года работал с БД ) - за счет индексации таблиц по необходимым полям. Вот я и решил создать свой класс, который кроме списка с данными будет хранить дополнительные списки отсортированные по нужным полям. Этот класс берет на себя все вопросы по добавлению и удалению данных, добавлению и удалению индексов, атоматической синхронизации списков, а так же, собственно, бинарному поиску по заранее проиндексированному полю в любой момент времени. День работы - и у меня получилось создать generic класс, который соответствует всем этим требованиям. За счет применения рефлексии индексируемые поля могут быть практически любого типа. Если кому кроме идеи еще интересна и реализация - могу выложить.
2
|
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
|
|
13.07.2009, 22:10 [ТС] | 12 |
Конечно выложи либо на емайл!
0
|
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
|
||||||||||||||||||||||||||
14.07.2009, 00:50 | 13 | |||||||||||||||||||||||||
В виду некоторой глобальности задачи может есть смысл выложить класс куда-то как статью?
Я его пока только проверил на работоспособность. Для того, что бы это было более-менее законченное решение, нужно код задокументировать, но понять, что к чему можно:
В качестве индексируемых полей могут выступать только public properties любого типа-значения Поддерживается так же обратный порядок сортировки ! Экспериментальный класс
IdleTimerCore - это моя обертка вокруг объекта Stopwatch, которая позволяет создавать произвольное к-во таймеров либо для измерения скорости того или иного участка кода (этот пример сравнивает скорость двоичного поиска по индексу против простого поиска перебором с List<T>), или для вызова произвольной функции по истечению заданного отрезка времени. Нашел в коде маленькую глупость, которая теоретически могла привести к проблемам, заменил
3
|
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
|
|
15.07.2009, 21:10 | 14 |
Sergei, так как, пригодился тебе мой класс ?
Я сегодня над ним еще немного поработал: немного переработал, задокументировал все функции, добавил новую функциональность, а именно: 1) Добавил поле unique для автоматического контроля при добавлении записей с полями имеющие одинаковые значения, (аналог ключевого поля в БД) 2) Переписал методы Add() и AddIndex() которые теперь учитывают значение поля unique. 3) Поправил метод Delete(), который мог удалить нету запись из индексатора в котором находилось несколько записей с тем же значением индексируемого поля 4) Добавил еще два метода для удаления с быстрым поиском наличия по индексируемому полю. 5) Еще некоторые мелкие улучшения Может кто подскажет, куда это можно выложить в виде статьи с примерами использования?
1
|
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
|
|
16.07.2009, 03:36 | 15 |
max_cn, напиши в личку админу. Если одобрит, ссылку в тему.
Добавлено через 27 минут 3 секунды max_cn, напиши в личку админу. Если одобрит, ссылку в тему.
0
|
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
|
|
17.07.2009, 23:37 | 16 |
Я решил выложить класс как статью здесь.
Приношу извинения, что на английском - но там все достаточно простым языком написано, думаю все можно будет понять. Плюс там есть полный проект со всеми файлами. Рад буду если кому то пригодится. В дополнения ко всему, что я писал в спецификации ранее, я еще добавил поддержку алиасов для возможности одновременно сортировать по одному полю в прямом и обратном порядке.
1
|
84 / 83 / 6
Регистрация: 13.07.2009
Сообщений: 107
|
||||||
21.07.2009, 13:44 | 17 | |||||
В процессе использования своего класса я обнаружил, что ему не достает одного метода - а именно метода, который изменит значение проиндексированного ранее поля с автоматической пересортировкой всех индексов для этого поля.
Что ж, я исправил это упущение, добавил метод :
Если производится попытка изменить значение у ключевого поля (unique=true) и в списке есть уже запись с полем равным этому значению - мой метод не даст внести такое изменение и вернет false (даже если есть несколько индексаторов по этому полю и некоторые не помечены как уникальные). Автоматически так же решается проблема, если попробовать изменить значение поля, по которому ранее были удалены все индексы - в таком случае не нужно делать никаких проверок во внешнем коде, класс автоматически изменит значение такого поля безо всяких сортировок. Этот метод так же вернет false если попытаться изменить значение у поля, у которого нету секции set {}. Я обновил вложение к той же статье вчера вечером. В самое ближайшее время от туда можно будет скачать как сам класс так и подробный пример, использующий все возможности класса.
0
|
4 / 4 / 0
Регистрация: 07.08.2015
Сообщений: 40
|
||||||||||||||||
07.05.2017, 05:11 | 18 | |||||||||||||||
Почему бы Вам не выложить полный код, как выглядит метод
А также что за
0
|
4 / 4 / 0
Регистрация: 07.08.2015
Сообщений: 40
|
|||||||||||
07.05.2017, 07:18 | 20 | ||||||||||
В гугле по моему запросу данная тема выпала одной из первых.
Добавлено через 7 минут Вот моя реализация:
0
|
07.05.2017, 07:18 | |
07.05.2017, 07:18 | |
Помогаю со студенческими работами здесь
20
Класс: Задача состоит в том, чтобы уметь сортировать по разным параметрам объекты класса автомобиль. перебрать все элементы List удовлетворяющие параметрам, удаляя взятые Поиск по определенному или двум и более параметрам в List.Find Сортировка двумерного List<List<string>>, по 1-ой строке, чтобы элементы 2-ой строки передвинулись в соответствии с 1-ой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |