Упорядоченный список с повторяющимися значениями (Sorted multilist)

При разработке пользовательских интерфейсов периодически требуется к элементу управления (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");

Код класса и тестовый пример можно загрузить в конце заметки.

Прикрепленный файлРазмер
Package icon SortedMultilist.zip45.18 KB

Комментарии

Изображение пользователя ipanshin.

Модификация

Модификация понятна, если ничего кроме данного приложения нет. Но обычная на сегодняшний день практика использования БД делает этот класс неактуальным. Ведь храни все в Бд и дергай соответсвующе написанную процедуру и этот класс не нужен. Надо грузить более БД чем то, что работает на стороне клиента. Разве нет?

Изображение пользователя Serguei_Tarassov.

Много звеньев

Это нужно в многозвенной схеме. К клиенту приезжают некие данные в заданном формате. А уж как их представить - его дело.

Разумеется, в двухзвенной схеме такие извраты и даром не нужны, все решается одним ORDER BY. Но простота означает, что многих людей придется уволить.