Задания для самостоятельного выполнения. 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();

}

 

Запустите приложение. Проверьте, правильно ли выполняется сортировка по квартире.