14.02.2017 Views

. Стиллмен, Дж. Грин - Изучаем 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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!