При разработке пользовательских интерфейсов периодически требуется к элементу управления (control) типа списка/выпадающего списка (ListBox, DropDownList) пристыковать (data bind) коллекцию (список) объектов в качестве источника данных. Дружественный интерфейс предполагает, что данные в списке отсортированы. Но если в списке имеются повторяющиеся значения, то использование стандартных классов типа SortedList или Dictionary становится невозможным.
Для решения этой проблемы был создан обобщенный (generic) класс SortedMultilist, хранящий отсортированный по ключу список пар и допускающий дублирование (неуникальность) значений ключа. Собственно, употреблять в этом случае термин "ключ" уже некорректно, оставим его для "совместимости".
Пример использования для Winforms:
SortedMultilist<String, string> s = new SortedMultilist<string, string>(); s.Add("Jerard Depardieu", "La chèvre"); s.Add("Pierre Richard", "Le coup du parapluie"); s.Add("Jerard Depardieu", "Les compères"); s.Add("Jean Marais", "Fantomas"); s.Add("Christian Clavier", "Les visiteurs"); s.Add("Alain Delon", "Les avanturiers"); s.Add("Jean Marais", "Fanfan la Tulipe"); s.Add("Jean-Paul Belmondo", "Le professionel"); listBox1.DataSource = s; listBox1.DisplayMember = "key"; listBox1.ValueMember = "value"; label1.DataBindings.Add("Text", s, "value"); SortedMultilist<DateTime, int> s2 = new SortedMultilist<DateTime, int>(); s2.Add(DateTime.Parse("2008-12-01"), 31); s2.Add(DateTime.Parse("2008-02-02"), 28); s2.Add(DateTime.Parse("2008-02-02"), 29); s2.Add(DateTime.Parse("2008-11-11"), 30); listBox2.DataSource = s2; listBox2.DisplayMember = "key"; listBox2.ValueMember = "value"; label2.DataBindings.Add("Text", s2, "value");
Код класса и тестовый пример можно загрузить в конце заметки.
Прикрепленный файл | Размер |
---|---|
![]() | 45.18 KB |
Комментарии
Модификация
Пишет ipanshin,
Модификация понятна, если ничего кроме данного приложения нет. Но обычная на сегодняшний день практика использования БД делает этот класс неактуальным. Ведь храни все в Бд и дергай соответсвующе написанную процедуру и этот класс не нужен. Надо грузить более БД чем то, что работает на стороне клиента. Разве нет?
Много звеньев
Пишет st,
Это нужно в многозвенной схеме. К клиенту приезжают некие данные в заданном формате. А уж как их представить - его дело.
Разумеется, в двухзвенной схеме такие извраты и даром не нужны, все решается одним ORDER BY. Но простота означает, что многих людей придется уволить.