Kolekcijas ir svarīgs jēdziens OOP, un pilnīgs atbalsts kolekcijām C# ir viens no labākajiem valodā.
Kāpēc izmantot vispārējas kopas? Pirms C# 2.0 kolekcijas varēja īstenot divos galvenajos veidos: a. Izmantojiet ArrayList Objektu ievietošana tieši masīvu sarakstā ir intuitīva, bet, tā kā kolekcijas vienumi ir tipa objekts, jums ir jāveic garlaicīga tipa konvertēšana katru reizi, kad to izmantojat. b. Pielāgotu kolekcijas klašu izmantošana Izplatīta prakse ir pārmantot pielāgotu klasi no CollectionBase abstraktās klases un ieviest spēcīgu tipu kolekciju, iekapsulējot IList objektu. Šī metode prasa rakstīt atbilstošu pielāgotu klasi katram kolekcijas veidam, kas ir daudz darba. Vispārējo kolekciju parādīšanās labi atrisina iepriekš minētās problēmas, un, lai izveidotu noteikta tipa kopu, var izmantot tikai vienu koda rindu. Kas ir vispārīgs? Ģenēriskie ir jauni elementi C# 2.0 (ko sauc par veidnēm C++), kas galvenokārt tiek izmantoti, lai atrisinātu virkni līdzīgu problēmu. Šis mehānisms ļauj klases nosaukumu nodot kā argumentu vispārējam tipam un ģenerēt atbilstošo objektu. Var būt labāk domāt par ģenēriskiem vārdiem (ieskaitot klases, saskarnes, metodes, delegātus utt.) kā veidnes, kur varianta daļa tiek aizstāta ar klases nosaukumu, kas nodots kā arguments, kā rezultātā tiek iegūta jauna tipa definīcija. Vispārēja ir salīdzinoši liela tēma, un es to šeit detalizēti neanalizēšu, un tie, kas ir ieinteresēti, var iepazīties ar attiecīgo informāciju. Kā izveidot vispārēju kolekciju? Kolekciju izveidei tiek izmantota saraksta vispārējā klase System.Collections.Generic nosaukumtelpā<T>, un tās sintakse ir šāda: [mw_shl_code=csharp,true] List<T> ListOfT = jauns List<T>(); [/mw_shl_code] "T" ir izmantojamais tips, kas var būt vienkārši tipi, piemēram, virkne, int vai lietotāja definēti tipi. Apskatīsim konkrētu piemēru.
Personu klase ir definēta šādi: [mw_shl_code=csharp,true]klase Persona
{ privātās virknes _name; Vārds privāts int _age; Vecums
Personas objekta izveide publiska persona(virknes vārds, int vecums) { this._name = Vārds; this._age = vecums; }
Vārds publiskās virknes nosaukums { iegūt { atgriezties _name; } }
Vecums publiskais int Vecums { iegūt { atgriezties _age; } }
}
//创建Person对象 Persona p1 = jauna persona ("Zhang San", 30); Persona p2 = jauna persona ("Li Si", 20); Persona p3 = jauna persona ("Wang Wu", 50);
//创建类型为Person的对象集合 Personu saraksts<Person> = jauns Saraksts<Person>();
//将Person对象放入集合 personas. Pievienot (1. lpp.); personas. Pievienot (2. lpp.); personas. Pievienot (p3);
//输出第2个人的姓名 Console.Write(personas[1]. Vārds, uzvārds); [/mw_shl_code] Kā redzat, vispārējās kolekcijas ievērojami vienkāršo kolekciju ieviešanas kodu, caur kuru jūs varat viegli izveidot noteiktu veidu kolekcijas. Ne tikai tas, bet arī vispārējās kolekcijas nodrošina jaudīgākas funkcijas, apskatīsim šķirošanu un meklēšanu tajās. Vispārējo kolekciju kārtošana Kārtošana ir balstīta uz salīdzinājumu, un, lai kārtotu, vispirms ir jāsalīdzina. Piemēram, ja ir divi skaitļi 1 un 2, lai tos sakārtotu, mums vispirms ir jāsalīdzina šie divi skaitļi un jākārto tie saskaņā ar salīdzināšanas rezultātiem. Ja vēlaties salīdzināt objektus, situācija ir nedaudz sarežģītāka, piemēram, ja salīdzināt personas objektus, varat salīdzināt pēc vārda vai vecuma, kas prasa salīdzināšanas noteikumu noteikšanu. Objektam var būt vairākas salīdzināšanas kārtulas, bet tikai viena noklusējuma kārtula, kas tiek ievietota klasē, kas definē objektu. Noklusējuma salīdzināšanas kārtulas ir definētas metodē CompareTo, kas pieder IComparable <T>vispārējam interfeisam. Skatiet zemāk esošo kodu: [mw_shl_code=csharp,true]klase Persona :IComparable<Person>
{ Salīdzināt pēc vecuma public int CompareTo(Person p) { atgriezt šo. Vecums - p.Vecums; } }[/mw_shl_code] Metodes CompareTo parametri ir vēl viens tāda paša tipa objekts, ar kuru jāsalīdzina, atgrieztā vērtība ir int tips, ja atgrieztā vērtība ir lielāka par 0, tas nozīmē, ka pirmais objekts ir lielāks par otro objektu, ja atgrieztā vērtība ir mazāka par 0, tas nozīmē, ka pirmais objekts ir mazāks par otro objektu, un, ja tas atgriež 0, abi objekti ir vienādi. Pēc noklusējuma salīdzināšanas kārtulu definēšanas kolekciju var kārtot, izmantojot metodi Kārtot bez parametriem, šādi: [mw_shl_code=csharp,true]// Kārtot kolekciju saskaņā ar noklusējuma kārtulām personas. Kārtot ();
//输出所有人姓名 foreach (Persona p personās)
{ Console.WriteLine(p.Name); Izvades secība ir "Li Si", "Zhang San" un "Wang Wu" }[/mw_shl_code] Praksē bieži vien ir nepieciešams kārtot kolekciju pēc dažādiem noteikumiem, kas prasa definēt citus salīdzināšanas noteikumus, kurus var definēt salīdzināšanas metodē, kas pieder pie IComparer <T>vispārējā interfeisa, lūdzu, skatiet šādu kodu: [mw_shl_code=csharp,true]class NameComparer : IComparer<Person>
{ Krātuves sekvencētāja instances publiskais statiskais NameComparer Default = jauns NameComparer();
Salīdzināt pēc nosaukuma publiskais int Salīdzināt(Persona p1, Persona p2) { atgriezt System.Collections.Comparer.Default.Compare(p1. Vārds, 2. lpp. Vārds, uzvārds); } }[/mw_shl_code] Salīdzināšanas metodes parametri ir divi vienāda tipa objekti, kas jāsalīdzina, un atgrieztās vērtības tips ir int, un atgrieztās vērtības apstrādes kārtulas ir tādas pašas kā metodes CompareTo. Comparer.Default atgriež iebūvētu salīdzinātāja objektu, lai salīdzinātu divus viena tipa objektus. Tālāk ir aprakstīts, kā kārtot kolekciju, izmantojot šo jaundefinēto salīdzinātāju. [mw_shl_code=csharp,true]//Kārtot kolekciju pēc nosaukuma personas. Sort(NameComparer.Default);
//输出所有人姓名 foreach (Persona p personās)
{ Console.WriteLine(p.Name); Izvades secība ir "Li Si", "Wang Wu" un "Zhang San" }[/mw_shl_code] Varat arī kārtot kolekciju, deleģējot, pirmkārt, definēt metodi, kā pārstāvis izsaukt, lai saglabātu salīdzināšanas kārtulas, un jūs varat izmantot statisku metodi. Skatiet zemāk esošo kodu: [mw_shl_code=csharp,true]klase PersonComparison
{ Salīdzināt pēc nosaukuma publiskais statiskais int Vārds(Persona p1, Persona p2) { atgriezt System.Collections.Comparer.Default.Compare(p1. Vārds, 2. lpp. Vārds, uzvārds); } }[/mw_shl_code] Metodes parametri ir divi vienāda tipa objekti, kas jāsalīdzina, atgrieztās vērtības tips ir int, un atgrieztās vērtības apstrādes kārtula ir tāda pati kā metodei CompareTo.Pēc tam kārtojiet kolekciju, izmantojot iebūvēto vispārējo pārstāvi System.Comparison<T>: [mw_shl_code=csharp,true] System.Comparison<Person> NameComparison = jauns System.Comparison<Person>(PersonComparison.Name); personas. Sort(NameComparison);
//输出所有人姓名 foreach (Persona p personās)
{ Console.WriteLine(p.Name); Izvades secība ir "Li Si", "Wang Wu" un "Zhang San" }[/mw_shl_code] Var redzēt, ka pēdējās divas metodes var kārtot kolekciju saskaņā ar norādītajiem noteikumiem, bet autors dod priekšroku deleģēšanas metodei un var apsvērt dažādu salīdzināšanas noteikumu ievietošanu klasē un pēc tam tos elastīgi izsaukt. Vispārīgu kolekciju meklēšana Meklēšana ir atrast vienumus, kas atbilst noteiktiem kolekcijas nosacījumiem, un pēc vajadzības var definēt un izsaukt vairākus meklēšanas nosacījumus. Vispirms definējiet meklēšanas kritērijus šādi: [mw_shl_code=csharp,true]klase PersonPredikāts
{ Atrodiet pusmūža cilvēkus (vecāki par 40 gadiem) publiskais statiskais bool MidAge (persona p) { if (p.Vecums >= 40) atgriešanās true; citādi atgriešanās nepatiesa; } }[/mw_shl_code] Iepriekš minētie meklēšanas kritēriji tiek ievietoti statiskā metodē ar Būla atgriešanas tipu, un kolekcijas vienumi, kas atbilst noteiktiem nosacījumiem, atgriež patiesu, citādi nepatiesu.Pēc tam meklējiet kolekciju, izmantojot iebūvēto vispārējo pārstāvi System.Predicate<T>: [mw_shl_code=csharp,true] System.Predicate<Person> MidAgePredicate = new System.Predicate<Person>(PersonPredicate.MidAge); Saraksts<Person> MidAgePersons = personas. FindAll (MidAgePredicate);
//输出所有的中年人姓名 foreach (Persona p MidAgePersons)
{ Console.WriteLine(p.Name); Izeja "Wang Wu" }[/mw_shl_code] Vispārējo kolekciju paplašināšana Ko darīt, ja vēlaties iegūt visu komplektā esošo cilvēku vārdus, atdalot tos ar komatu? Ņemot vērā, ka funkcionalitāte, ko var nodrošināt viena klase, ir ierobežota, ir dabiski domāt <T>par saraksta klases paplašināšanu, kas arī ir klase un tāpēc to var paplašināt ar mantojumu. Skatiet zemāk esošo kodu: [mw_shl_code=csharp,true]// Definējiet personu kolekcijas klasi klase Personas : Saraksts<Person>
{ Visu kolekcijas dalībnieku vārdu iegūšana publiskā virkne GetAllNames() { ja (šis. Skaits == 0) atgriezties "";
virkne val = ""; foreach (Persona p šeit) { val += p.Name + ","; }
atgriešanās val. Apakšvirkne(0, val. garums - 1); }
}
//创建并填充Persons集合 Personas PersonCol = jaunas personas(); PersonCol.Add(1. lpp.); PersonCol.Add(2. lpp.); PersonCol.Add(3. lpp.);
//输出所有人姓名 Console.Write(PersonCol.GetAllNames()); Izeja "Zhang San, Li Si, Wang Wu"[/mw_shl_code] Kopsavilkums: Šajā rakstā galvenā uzmanība pievērsta ģenērisko zāļu izmantošanai C# 2.0, lai ieviestu kolekcijas, kā arī paplašinātu savākšanas funkciju, un pareiza vispārējo kolekciju izmantošana var samazināt lielu darba dublēšanos un ievērojami uzlabot izstrādes efektivitāti. Patiesībā komplekti ir tikai tipisks ģenērisko zāļu pielietojums, un, ja vēlaties uzzināt vairāk par ģenēriskajām zālēm, varat iepazīties ar citiem attiecīgajiem materiāliem. Ceru, ka šis raksts jums bija noderīgs :-)
|