LINQ, operarea și orderbydescending orderby

operațiuni prin care se dispune permit construirea secvențelor de intrare într-o anumită ordine. Foarte important, și orderby, și necesită intrare OrderByDescending secvență de tip IEnumerable și secvența de tip retur IOrderedEnumerable. Transmit operații și orderby OrderByDescending ca secventa de intrare IOrderedEnumerable este imposibil. Motivul este că apelurile ulterioare la operațiunile și orderby OrderByDescending nu iau în considerare ordinea creată printr-un apel anterior la orderby și OrderByDescending. Aceasta înseamnă că secvența de transfer, întoarcerea orderby sau OrderByDescending, într-o ulterioară a apela orderby sau operațiune OrderByDescending nu are nici un sens.

În cazul în care este necesar un grad mai mare de ordonare, decât poate fi realizat cu un singur apel sau tranzacție orderby OrderByDescending, este necesar în mod succesiv de a provoca o funcționare sau ThenBy ThenByDescending, care vor fi menționate în următorul articol.

Operațiunea orderby vă permite să organizați secvența de intrare bazată pe metoda keySelector. care returnează o valoare cheie pentru fiecare element de intrare. secvența de ieșire comandat IOrderedEnumerable emise în ordine crescătoare, bazate pe valorile returnate de cheile.

Sortarea funcționării orderby executate determinată ca instabilă. Acest lucru înseamnă că nu păstrează ordinea elementelor de intrare. În cazul în care două elementul de intrare primit în funcțiune orderby în ordine, iar valorile-cheie ale acestor două elemente sunt identice, poziția lor în secvența de ieșire poate rămâne neschimbată sau schimbare, și nici nu este garantată una, nici alta. Chiar dacă totul arată bine, pentru că ordinea este definită ca fiind instabil, ar trebui să procedeze întotdeauna la acest lucru. Acest lucru înseamnă că nu trebuie să se bazeze pe ordinea elementelor provenind din operațiunile sau orderby OrderByDescending, pentru orice alt domeniu decât cel al apelului metodei. Depozitarea orice ordine care există în ordine transmise de la oricare dintre aceste operațiuni nu pot fi garantate.

Operațiunea orderby are două prototipuri descrise mai jos:

Primul prototip orderby

În această operațiune din stadiul tehnicii orderby transmise de intrare sursă de secvență și metoda delegat keySelector, și returnează un obiect, care, atunci când transferul are sursa de colectare loc de intrare, colectarea tuturor elementelor și transferarea fiecărei metode keySelector, eliminând astfel fiecare secvență cheie și ordonare pe baza acestor chei .

Metoda keySelector primește tip de element de intrare T și returnează un câmp din interiorul celulei, care este folosit ca un K cheie de tip valoare pentru acest element de intrare. Tipurile de R și T pot fi identici sau diferiți. Tipul valorii returnate de keySelector, trebuie să pună în aplicare interfața IComparable.

Al doilea prototip orderby

Acest prototip este la fel ca prima, cu excepția faptului că vă permite să treci un comparator obiect. Dacă utilizați această versiune de operare orderby, nu este nevoie să tastați K implementează interfața IComparable.

Codul de mai jos prezintă un exemplu de asteptare un prim prototip:

Codul din acest exemplu, aparatul reglează lungimea listei numelor lor. Rezultatul este după cum urmează:

LINQ, operarea și orderbydescending orderby

Acum am testat exemplul celui de al doilea prototip, folosind propriul comparator. Înainte de a afișa codul, este necesar să se uite la interfața IComparer.

Interfața IComparer necesită punerea în aplicare a unei singure metode numita comparare. Această metodă are două argumente ale int T același tip și returnează o valoare mai mare decât zero, dacă primul argument este mai mare decât al doilea, zero, - în cazul în care argumentele echivalente și o valoare mai mică decât zero - dacă primul argument este mai mic decât al doilea. Observați cum în această interfață și util generalizare prototip C #.

În acest exemplu, pentru claritate, un comparator nu este utilizat în mod implicit. Doar a crea o clasa care implementeaza interfata IComparer, care aranjează elementele pe baza raportului dintre vocalele si consoanele:

Această clasă conține două metode - Compară și GetVowelConstantCount. Comparați metoda necesară de interfață IComparer. este necesară metoda GetVowelConstantCount pentru uz intern Comparați și permite să se obțină numărul de vocale și consoane în șirul de intrare. De asemenea, trebuie să fie în măsură să producă aceeași logică în afara metodei Compara, astfel încât să puteți obține valorile care urmează să fie afișat când bucla printr-o secvență ordonată.

Ce face exact comparator - nu este atât de important. Este foarte puțin probabil ca va avea nevoie vreodată pentru a determina raportul dintre vocalele și consoane într-un rând, și chiar mai puțin probabil că este necesar să se compare două șiruri bazate pe acest raport. Mai important, ca o clasă a fost creat, care implementează interfața IComparer prin punerea în aplicare a metodei de comparare. Aici puteți observa o implementare generală a metodei Compara în cazul în care blocul / altceva la sfârșitul metodei. După cum puteți vedea, acest bloc de cod se întoarce -1, 1, sau O, care necesită o interfață de contract IComparer.

Acum puteți utiliza acest cod:

Înainte de a apela orderby creează o instanță a comparatorului. Un exemplu ar putea fi creată în metoda orderby apel, dar apoi nu a reușit să se facă referire la acesta într-o buclă foreach. Exemplul următor prezintă rezultatele Experimentului:

LINQ, operarea și orderbydescending orderby

După cum puteți vedea, elementele cu un raport mai mic de vocalele și consoanele sunt afișate primele.

OrderByDescending

Această operațiune de prototipuri și se comportă ca și operarea orderby, dar cu diferența că ordinele descrescătoare. Mai jos este un exemplu de funcționare:

După cum puteți vedea, numele de mașini sunt aranjate în ordine descrescătoare:

LINQ, operarea și orderbydescending orderby