. Стиллмен, Дж. Грин - Изучаем C#, 2-е издание
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
выб<strong>е</strong>рит<strong>е</strong> карту, любую карту<br />
Сложны<strong>е</strong> сх<strong>е</strong>мы срабн<strong>е</strong>ния<br />
О тд<strong>е</strong>л ьн ы й класс для со р т и р о в к и уток п о зв о л я <strong>е</strong>т п р и м <strong>е</strong><br />
ни ть б о л <strong>е</strong> <strong>е</strong> сл ож н ую логику срав н <strong>е</strong>н и я , д обав и в чл<strong>е</strong>ны ,<br />
о п р <strong>е</strong>д <strong>е</strong>л я ю щ и <strong>е</strong> м <strong>е</strong>то д со р т и р о в к и колл<strong>е</strong>кции.<br />
enum s o r t c r i t e r i a { П<strong>е</strong>р<strong>е</strong>числ<strong>е</strong>ни<strong>е</strong> указыва<strong>е</strong>т объ<strong>е</strong>кs<br />
iz e T h e n K in d , т у, каким им<strong>е</strong>нно способом бцдит<br />
K in d T h e n S iz e , сорт ироваться ут ки. П<strong>е</strong>рвый<br />
^<br />
разм <strong>е</strong>ру, зат <strong>е</strong>м<br />
— *^0 виду», второй —• наоборот.<br />
c l a s s DuckComparer : IComparer {<br />
p u b l i c S o r t c r i t e r i a S o r tB y = S o r t C r i t e r i a . S izeT h en K in d ; ^<br />
p u b l i c i n t C om pare(Duck x . Duck y) {<br />
i f (S o r tB y == S o r t c r i t e r i a .S iz e T h e n K i n d )<br />
e l s e<br />
i f ( x .S i z e > y . S i z e )<br />
r e t u r n 1;<br />
e l s e i f ( x .S i z e < y . S i z e )<br />
r e t u r n -1 ;<br />
e l s e<br />
i f (x .K in d > y .K in d )<br />
r e t u r n 1;<br />
e l s e i f (x .K in d < y .K in d )<br />
r e t u r n -1 ;<br />
e l s e<br />
r e t u r n 0:<br />
i f (x .K in d > y .K in d )<br />
r e t u r n 1;<br />
e l s e i f (x .K in d < y .K in d )<br />
r e t u r n -1 ;<br />
e l s e<br />
i f ( x .S i z e > y . S i z e )<br />
r e t u r n 1;<br />
e l s e i f ( x . S i z e < y . S i z e )<br />
r e t u r n -1 ;<br />
e l s e<br />
r e t u r n 0;<br />
DuckComparer com parer = new D uckC om parer() ;<br />
co m p a r er . S o r tB y = S o r t c r it e r ia .K in d T h e n S iz e ,•<br />
d u c k s .S o r t(c o m p a r e r ) ;<br />
P r in tD u c k s(d u c k s) ;<br />
c o m p a r e r .S o r tB y = S o r t c r i t e r i a . S izeT h en K in d ;<br />
d u c k s . S o r t(c o m p a r e r ) ;<br />
P r in t D u c k s ( d u c k s ) ;<br />
л<br />
Если м<strong>е</strong>тод 5ог1() для объ<strong>е</strong>кта<br />
1Сотраг<strong>е</strong>г н<strong>е</strong> указан, буд<strong>е</strong>т<br />
использован заданный по<br />
умолчанию м<strong>е</strong>тод сравн<strong>е</strong>ния<br />
значимых типов или ссылок.<br />
Класс, выполняющий сравн<strong>е</strong>ни<strong>е</strong> уток,<br />
бол<strong>е</strong><strong>е</strong> слож<strong>е</strong>н. М<strong>е</strong>тод Сотраг<strong>е</strong>()<br />
использу<strong>е</strong>т т<strong>е</strong> ж<strong>е</strong> самы<strong>е</strong> парам<strong>е</strong>тры,<br />
но сначала пров<strong>е</strong>ря<strong>е</strong>т знач<strong>е</strong>ни<strong>е</strong><br />
открытого поля ЗогЬВу, чтобы<br />
опр<strong>е</strong>д<strong>е</strong>лить способ сортировки.<br />
Оп<strong>е</strong>ратор if пров<strong>е</strong>ря<strong>е</strong>т пол<strong>е</strong><br />
Зо^В у. Если оно им<strong>е</strong><strong>е</strong>т знач<strong>е</strong>ни<strong>е</strong><br />
\ 51г<strong>е</strong>Тк<strong>е</strong>пК!пс(, утки сначала будут<br />
^ упорядочиваться по разм<strong>е</strong>ру, а<br />
зат<strong>е</strong>м в пр<strong>е</strong>д<strong>е</strong>лах каждого разм <strong>е</strong><br />
ра пройд<strong>е</strong>т сортировка по виду.<br />
Раньил<strong>е</strong>, <strong>е</strong>сли утки им<strong>е</strong>ли один и тот<br />
ж<strong>е</strong> разм<strong>е</strong>р, возвращалось нул<strong>е</strong>во<strong>е</strong><br />
знач<strong>е</strong>ни<strong>е</strong>, т<strong>е</strong>п<strong>е</strong>рь ж<strong>е</strong> пров<strong>е</strong>ря<strong>е</strong>тся<br />
<strong>е</strong>щ<strong>е</strong> и видовая принадл<strong>е</strong>жность уток.<br />
В итог<strong>е</strong> О возвраща<strong>е</strong>тся н<strong>е</strong> только когда<br />
утки им<strong>е</strong>ют одинаковый разм<strong>е</strong>р, но<br />
и относятся к одному и тому ж<strong>е</strong> виду.<br />
Если знач<strong>е</strong>ни<strong>е</strong> поля ЗогіВу отлично<br />
от Віг<strong>е</strong>Тк<strong>е</strong>пКії'^сі, то сначала<br />
сортировка выполня<strong>е</strong>тся по виду<br />
утки. Обнаружив двух уток одного<br />
вида, компаратор сравнива<strong>е</strong>т их<br />
разм<strong>е</strong>р.<br />
Сначала мы, как<br />
экз<strong>е</strong>мпляр к о м п а р а т о р а З а т <strong>е</strong> м<br />
присваива<strong>е</strong>м знач<strong>е</strong>ни<strong>е</strong> п о л ю .^опт ^<br />
7оТл<strong>е</strong> ч<strong>е</strong>го можно 6bifam b м<strong>е</strong>тод<br />
ducks SortQ. Т<strong>е</strong>п<strong>е</strong>рь вы мож<strong>е</strong>т<strong>е</strong><br />
м<strong>е</strong>нять м<strong>е</strong>тод сортировки уток,<br />
р<strong>е</strong>дактируя знач<strong>е</strong>ни<strong>е</strong> одного поля.<br />
Добавьт<strong>е</strong> этот код в М ^ ^ _<br />
Тд MainQ, и вы получит<strong>е</strong> дозмож<br />
н о с т ь сортировать колл<strong>е</strong>кцию<br />
много раз!<br />
362 глава 8