Задания для самостоятельного выполнения. 3.6.Добавьте поиск информации об абоненте телефонного справочника по:
3.6.Добавьте поиск информации об абоненте телефонного справочника по:
– адресу (улице, дому, квартире);
– телефону.
Упражнение 13.4. Дополним приложение “Телефонный справочник” возможностью сортировки абонентов.
Решение
1-й этап.Доработаем визуальный интерфейс приложения.
Дополним меню пунктом “Сортировка” и подпунктами “По фамилии” и “По квартире”.
2-й этап.Разработаем необходимый программный код.
Списки List<T> можно сортировать с помощью стандартного метода Sort(). Для определения порядка элементов списка данный метод использует компаратор (специальный класс) по умолчанию Comparer.Default. Но в нашем приложении список состоит из записей со многими полями, в таком случае компаратор по умолчанию не сможет отсортировать список, поскольку не умеет определять порядок элементов. В связи с этим мы напишем собственный компаратор. Для этого в пространстве имен namespace Lab13 (с конца программы отступите одну закрывающую фигурную скобку, для удобства можете свернуть класс формы) опишите класс-компаратор CompareByLastName:
class CompareByLastName : IComparer<Note>
Затем щелкните мышью по слову IComparer, под первой буквой этого слова вы увидите подчеркивание в виде маленького синего прямоугольника. Наведите на него указатель мыши и, нажав на стрелочку вниз на появившейся иконке, вы увидите список опций, среди них выберите “Implement interface ‘IComparer<Note>’” (Реализовать интерфейс) (рис. 13.7).
В описании класса появится заготовка метода Compare(), который на вход получает два объекта класса Note, а на выходе выдает целое число: положительное, если первый объект больше второго, отрицательное – если меньше, и ноль, если объекты равны.
class CompareByLastName : IComparer<Note>
{
#region IComparer<Note> Members
public int Compare(Note x, Note y)
{
throw new NotImplementedException();
}
#endregion
}
Директива #region … #endregion ограничивает часть кода, который может быть свернут.
Измените тело метода Compare() – вместо строки, указывающей, какой тип исключения будет генерироваться при вызове этого метода:
throw new NotImplementedException();
запишите следующий оператор, который будет сравнивать две строки (фамилии):
return string.Compare(x.LastName, y.LastName);
Таким образом, наш класс-компаратор CompareByLastName будет сравнивать элементы списка по фамилии.
Создайте обработчик выбора подпункта меню “По фамилии” (в пункте “Сортировка”). Запишите в него следующие операторы.
if (PhoneNote.Count > 0) // если список не пуст
{
// сортировка списка по фамилии
PhoneNote.Sort(new CompareByLastName());
current = 0; // задаем номер текущего элемента
PrintElement(); // вывод текущего элемента
}
Запустите приложение. Проверьте, правильно ли выполняется сортировка по фамилии.
Сейчас аналогично создайте компаратор для сравнения абонентов по квартире.
class CompareByFlat : IComparer<Note>
{
#region IComparer<Note> Members
public int Compare(Note x, Note y)
{
return x.Flat.CompareTo(y.Flat);
}
#endregion
}
Обработчик выбора подпункта “По квартире” должен содержать следующие операторы:
if (PhoneNote.Count > 0)
{
PhoneNote.Sort(new CompareByFlat());
current = 0;
PrintElement();
}
Запустите приложение. Проверьте, правильно ли выполняется сортировка по квартире.