|
Программирование >> Программирование с использованием ajax
Описание полученных результатов Между этим примером и примером ChllEx02 есть только два отличия. Первое состоит в том, что строка кода Animals animalCollection = new Animals(); была заменена такой строкой: List<Animal> animalCollection = new List<Animal>(); Второе и более важное отличие состоит в том, что в проекте больше нет класса коллекции Animals. Вся трудная работа, которая в предыдущем примере проводилась для создания этого класса, здесь была выполнена с помощью единственной строки кода за счет использования обобщенного класса коллекции. В качестве альтернативного варианта, такого же результата можно было бы добиться, сохранив код в Program.cs неизменным и воспользовавшись следующим определением для класса Animals: public class Animals : List<Animal> Такой подход имел бы свои преимущества, а именно - сделал бы код в файле Program. CS несколько более удобным для восприятия и плюс позволил бы добавлять в класс Animals дополнительные члены там, где это необходимо. Конечно, может возникнуть вопрос, а зачем вообще может потребоваться наследовать классы от CollectionBase, и это действительно хороший вопрос. На самом деле, ситуаций, в которых подобное может оказаться необходимым, существует немного. Естественно, знать о том, как класс CollectionBase работает внутри, полезно, потому что List<T> работает во многом аналогично, но в основном класс CollectionBase все-таки существует для обратной совместимости. Единственной реальной ситуацией, когда действительно может возникать желание применять класс CollectionBase, является та, когда требуется иметь гораздо больший контроль над членами, которые отображаются пользователям класса. Например, при желании создать класс коллекции с модификатором доступа internal в методе Add() использование CollectionBase может оказаться наилучшим вариантом. Еще можно передавать конструктору List<T> значение первоначальной вместимости списка (в виде int) или первоначальный список элементов с помощью интерфейса IEnumerable<T>. Класс List<T> входит в число классов, которые поддерживают этот интерфейс. Сортировка и поиск в обобщенных списках Сортировка обобщенного списка выглядит во многом так же, как и сортировка любого другого списка. В предыдущей главе уже рассказывалось о том, как использовать интерфейсы IComparer и IComparable для сравнения двух объектов и тем самым сортировать список объектов такого типа. Единственное отличие здесь состоит в том, что применять нужно обобщенные интерфейсы IComparer<T> и IComparable<T>, которые предоставляют немного другие, специфические для каждого типа методы. Все отличия этих методов кратко описаны в табл. 12.4. Таблица 12.4. Отличия между обобщенными и не обобщенными методами Обобщенный метод Не обобщенный метод Отличие int IComparable<T>.СотрагеТо( Т otherObj) bool IComparable<T>.Equals( T OtherObj) int IComparer<T>.Compare( T objectA, T objectB) bool IComparer<T>.Equals( T objectA, T objectB) object.Equals 0 instead int IComparer<T>.GetHashCode( T ObjectA) IComparable.СотрагеТо( object OtherObj) int IComparer.Compare( object objectA, object objectB) В обобщенных версиях является строго типизированным. Не существует в не обобщенном интерфейсе; вместо него может использоваться унаследованный метод obj ect. Equals () В обобщенных версиях является строго типизированным Не существует в не обобщенном интерфейсе; вместо него может использоваться унаследованный метод object.Equals о Не существует в не обобщенном интерфейсе; вместо него может использоваться унаследованный метод object. GetHashCodeO Для сортировки List<T> может предоставляться или интерфейс IComparable<T> прямо в сортируемом типе, или интерфейс IComparer<T>. В качестве альтернативного варианта, методом сортировки может служить и обобщенный делегат. Данный подход является гораздо более интересным для рассмотрения, поскольку реализация упомянутых выше интерфейсов действительно ничем не отличается от реализации их не обобщенных аналогов. В двух словах, все, что необходимо для сортировки списка - это метод, сравнивающий два объекта типа Т, а для выполнения поиска - метод, проверяющий объект типа Т на предмет того, отвечает ли конкретным критериям. То есть все сводится к определению таких методов, и для оказания помощи в этом предусмотрены два соответствующих обобщенных типа-делегата, которые можно использовать. □ Comparison<T> - делегат для метода, применяемого для сортировки, со следующим возвращаемым типом и параметрами: int MeTOMiY objectA, Т objectB) □ Predicate<T> - делегат для метода, применяемого для поиска, со следующим возвращаемым типом и параметрами: bool метод{У targetObject) Можно определять любое количество таких методов и использовать их для оснастки методов сортировки и поиска в List<T>. В следующем практическом занятии представлен пример организации сортировки и поиска. Выполнение сортировки и поиска в List<T> 1. Создайте новое консольное приложение по имени СЫ2ЕхОЗ и сохраните его в каталоге С;\BegVCSharp\Chapterl2. 2. Щелкните правой кнопкой мыши на имени этого проекта в окне Solution Explorer и выберите в контекстном меню пункт AddiAclcl Existing Item (Добавить=> Добавить существующий элемент). 3. Выберите из каталога C:\BegVCSharp\Chapterl2\Chl2Ex01\Chl2Ex01 файл Vector.csH щелкните на кнопке Add (Добавить). 4. Измените объявление пространства имен в добавленном файле следующим образом: namespace Chl2Ex03 5. Добавьте новый класс с именем Vectors. 6. Измените код в файле Vectors.cs, как показано ниже: public class Vectors : List<Vector> { public Vectors 0 public Vectors(IEnumerable<Vector> initialltems) { foreach (Vector vector in initialltems) { Add(vector); public string Sum() { StringBuilder sb = new StringBuilder(); Vector currentPoint = new Vector(0.0, 0.0); sb.Append( origin ); foreach (Vector vector in this) sb.AppendFormat( + {0} , vector); currentPoint += vector; Sb.AppendFormat( = {0} , currentPoint); return sb.ToString0; 7. Добавьте новый класс по имени VectorDelegates. 8. Измените код в файле VectorDelegates. cs следующим образом: public static class VectorDelegates { public static int Compare(Vector x. Vector y) { if (x.R > y.R) return 1;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |