Категории
Войти
Поиск
Реклама
Полезное:
Спортивное питание креатин
Как принимать спортивное питание креатин для наращивания мышечной массы.
sportlife.dp.ua
Новые статьи
Опечатка?
Выделите текст и нажмите Shift+Enter.
И мы в ближайшее время ее исправим!
Счетчики
| Добавление к коллекции функций сортировки |
|
Реализация сортировки несколько сложнее. Прежде всего, имеется ряд методов и свойств базового класса, которые вы должны переопределить. Кроме того, код и применяемый для сортировки алгоритм с необходимостью несколько более сложны. Имеется четыре свойства, которые требуется переопределить: SupportsSortingCore, IsSortedCore, SortDirection-Соге и SortPropertyCore. Требуется переопределить также два метода: ApplySortCore и RemoveSortCore. Если бы вам просто требовалось поддерживать сортировку коллекции, все было бы не так сложно. Трудность представляет возможность удаления сортировки. Когда вы сортируете коллекцию, вы должны сделать так, чтобы с момента сортировки любой использующий коллекцию код видел ее переупорядоченной. Это означает, что вы должны действительно изменить содержимое коллекции, расположив ее в другом порядке, чтобы любой код, когда он итерирует коллекцию при помощи базовой реализации интерфейса lEnumerator, видел сортированный порядок. Поскольку требуется поддерживать удаление сортировки, вам нужен также способ вернуть содержимое коллекции обратно к первоначальному порядку. Простейшим способом сделать это является создание копии коллекции в ее несортированном состоянии до применения сортировки, а затем вы можете восстановить исходную коллекцию, когда сортировка удаляется. Однако здесь появляется другой уровень сложности - что будет, если в коллекцию добавляется или из коллекции удаляется элемент в то время, пока она сортирована? Элемент будет добавлен к сортированной коллекции, но если вы не будете перехватывать любые модификации коллекции, новый элемент или удаленный элемент не будет отражен в копии исходной коллекции, которую вы собираетесь восстановить при удалении сортировки. Для перехвата добавлений и удалений вам нужно переопределить еще некоторые методы базового класса BindingList<T>, такие, как Insertltem, Removeltem и Clearltems, и обеспечить выполнение одних тех же изменений как в первичной, так и в несортированной коллекции. Вам нужно позаботиться также о транзакционных добавлениях к коллекции, поэтому потребуется переопределение EndNew и CancelNew, а также транзакционное удаление из несортированной коллекции. Как видите, все усложняется весьма быстро. Чтобы продемонстрировать базовые возможности сортировки, давайте не будем поддерживать добавление и удаление элементов, когда коллекция сортирована. Вам все равно потребуется сделать копию существующей коллекции перед применением сортировки и возвратиться к этой копии, когда сортировка отменяется, но вам не нужно будет беспокоиться о добавляемых или удаляемых элементах и о поддержке параллельной коллекции, когда коллекция сортирована. Как уже упоминалось, класс List<T> имеет встроенную возможность сортировки, и вы можете воспользоваться ей для выполнения действительной сортировки. Класс производит сортировку, исходя из обобщенной реализации интерфейса lComparer<T>, которую вы передаете методу. Для peaлизации этого интерфейса вы создаете класс с методом Compare, который сравнивает объекты типа т и возвращает целое, показывающее, равен ли первый объект второму, больше он или меньше второго объекта. Какой критерий вы используете для решения о том, какое значение возвращать, определяется вами и вашей реализацией интерфейса. Реализация в листинге 9.4 использует идеи, взятые из рубрики Майкла Вайнхардта «Wonders of Windows Forms в «MSDN Online, которые сами восходят к более ранней статье Рокки Лотка. Я выбрал другую стратегию реализации и добавил возможность сортировки по нескольким свойствам, которая показана далее в обсуждении реализации интерфейса IBindingListView, но некоторые основные детали следующей реализации были взяты из серии статей Майкла «Custom Data Binding в зимних выпусках 2004 года. Класс Sortcomparer, показанный в листинге 9.4, обеспечивает базовую реализацию сравнения, которая должна использоваться с методом List.Sort. Класс SortComparer позволяет конструировать экземпляр класса, специфицировав свойство объектов, которое будет сравниваться для определения отношений «равно», «больше» или «меньше», передаваемое в дескрипторе свойства, и значение из перечисления ListSortDirection. Когда класс List<T> производит итерацию по списку, применяя внутренний алгоритм сортировки, он вызывает метод compare, передавая ему два объекта, с которыми он в данный момент работает в процессе сортировки. Реализация Compare из листинга пробует различные способы сравнения объектов. Сначала она извлекает значение специфицированного свойства каждого из объектов при помощи метода Getvalue дескриптора свойства. Затем она проверяет, реализует ли объект, который представляют эти значения, интерфейс IComparer. Это стандартный интерфейс в .NET Framework. Он реализует метод CompareTo, инкапсулирующий ту же логику, к которой мы стремимся - говоря конкретнее, если объект сам решает, что он равен другому переданному объекту, он возвращает О; если он больше, он возвращает 1; если он меньше, он возвращает.
Newer news items:
Older news items:
|
