Как сгруппировать строки по префиксу - PullRequest
1 голос
/ 08 апреля 2010

Я пишу пользовательский интерфейс Winform, в котором пользователь должен выбрать одного клиента. (По независящим от меня причинам я ограничен пользовательским интерфейсом, в котором используются только выпадающие списки, текстовые поля, флажки, только радиокнопки - т.е. никаких необычных специальных элементов управления пользовательского интерфейса)

Ситуация

  • Есть много клиентов (например, тысяча)
  • Если я соберу всех клиентов в одном раскрывающемся списке, клиенту будет легко даже увидеть всех клиентов. Кроме того, потребуется слишком много времени, чтобы удалить всех клиентов из БД для заполнения раскрывающегося списка
  • Моя мысль состоит в том, чтобы иметь два поля со списком, в первом перечислены группы клиентов по фамилии, например телефонная книга "Aa-Ac", "Ad-Ade", "Adf-B", при выборе первого поле со списком, оно включает второй для настраиваемого набора имен клиентов (не более, например, для 40 имен)

Вопрос

  • Мне нужен разумный способ группировки их имен, чтобы клиенту было понятно, какая группа содержит имя. То есть учитывая группу имен, которые мне нужно объединить, а затем в "Aa-Ac".

Комментарии

  • Мне не нужно решать общую проблему огромного количества имен - по нашим данным мы знаем, что 1000 имен - это максимум, с которым столкнутся наши пользователи.
  • Если есть другие методы, пожалуйста, поделитесь, но меня особенно интересует ответ на мой конкретный вопрос о том, как определить сегменты ("Aa-Ac" и т. Д.)

Ответы [ 3 ]

0 голосов
/ 08 апреля 2010

Tanascious 'предложение в основном на правильном пути, но я не думаю, что вы не два компонента. Прошло много времени с тех пор, как я занимался разработкой на C #, но если я правильно помню, один комбинированный список (listbox?) Вполне подходит для выбора между сотнями записей, потому что он поддерживает навигацию по типу поиска, т. Е. Если имя пользователь ищет «Доу, Джон», набрав «до», когда выбран компонент, пользователь почти во всех случаях вводит парочку в несколько записей, в большинстве случаев именно пользователю. На общедоступной веб-странице это будет менее чем оптимально, где все должно быть щелчком мыши, но для пользователей, ежедневно работающих с этим интерфейсом, обычно это не проблема.

0 голосов
/ 08 апреля 2010

Я думаю, вы должны подумать один или два раза, прежде чем остановиться на том, как должен работать графический интерфейс, но если вы действительно хотите использовать идею корзины, вы должны сделать что-то вроде этого:

Шаг 1, создайте сегменты:

  • Выберите желаемый размер сегмента (например, 40).
  • Сортировка имен.
  • Сделайте первые 40 имен первым ведром, 41-80 называет второе ведро и т. д., пока вы не создадите все ведра.

Шаг 2, определить «имена» сегментов («Adf-B» и т. Д.):

  • Позволяет использовать ведро [i] .Left для ссылки на левую часть имени i-го ведра («Adf» выше) и на ведро [i]. Справа («B»)
  • Позволяет использовать корзину [i] .Names для ссылки на список из 40 имен в этой корзине
  • Теперь, предполагая, что у нас есть функция, которая может определить, сколько символов мы должны использовать для различения двух строк (давайте назовем это CharsNeeded), мы можем сравнить конец / начало сегментов рядом друг с другом и извлечь имена из того, что .

Как это:

bucket[i].Left = bucket[i].Names.First().Substring(0, CharsNeeded(bucket[i].Names.First(), bucket[i-1].Names.Last()));
bucket[i].Right = bucket[i].Names.Last().Substring(0, CharsNeeded(bucket[i].Names.Last(), bucket[i+1].Names.First()));

CharsNeeded может быть реализовано следующим образом:

int CharsNeeded(string str1, string str2)
{
  int i=0;
  while (i < str1.Length && i < str2.Length && str1[i] == str2[i])
    i++;
  return i + 1;
}

Кроме того, позаботьтесь о крайних случаях, так как я не проверял индекс вне границ массива сегментов.

0 голосов
/ 08 апреля 2010

Другой метод:
Я бы объединил ComboBox с TextBox (это ваше текстовое поле? Или вы имели в виду метки только для чтения?), Чтобы пользователь мог ввести некоторые из первыхбуквы и ComboBox покажет все записи, начинающиеся с этих букв.В случае точного совпадения он может даже пропустить использование ComboBox и ускорить процесс.

...