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

| рубрика: Заметки | автор: st
Метки: ,

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

Исходный код класса и тестовый пример: SortedMultilist.zip