Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 22157|Atsakyti: 1

[Šaltinis] C# bendrasis "Range Rover" (posūkis)

[Kopijuoti nuorodą]
Paskelbta 2014-11-11 08:56:04 | | |
Kolekcijos yra svarbi OOP sąvoka, o visiškas C# kolekcijų palaikymas yra vienas geriausių kalbos.
    Kodėl verta naudoti bendruosius rinkinius?
    Prieš C# 2.0 kolekcijas buvo galima įgyvendinti dviem pagrindiniais būdais:
    a. Naudokite ArrayList
    Objektų įdėjimas tiesiai į ArrayList yra intuityvus, bet kadangi kolekcijos elementai yra objekto tipo, kiekvieną kartą jį naudodamiesi turite atlikti varginantį tipo konvertavimą.
    b. Pasirinktinių rinkimo klasių naudojimas
    Įprasta praktika yra paveldėti pasirinktinę klasę iš CollectionBase abstrakčios klasės ir įgyvendinti stiprų tipų rinkinį inkapsuliuojant IList objektą. Šis metodas reikalauja parašyti atitinkamą pasirinktinę klasę kiekvienam kolekcijos tipui, o tai yra daug darbo. Bendrųjų kolekcijų atsiradimas gerai išsprendžia aukščiau nurodytas problemas, o nurodyto tipo rinkiniui sukurti galima naudoti tik vieną kodo eilutę.
    Kas yra bendrinis?
    Generiniai vaistai yra nauji C# 2.0 elementai (vadinami šablonais C++), kurie daugiausia naudojami panašių problemų serijai spręsti. Šis mechanizmas leidžia klasės pavadinimą perduoti kaip argumentą bendrajam tipui ir sugeneruojamas atitinkamas objektas. Galbūt geriau galvoti apie bendrinius (įskaitant klases, sąsajas, metodus, delegatus ir t.t.) kaip šablonus, kur varianto dalis pakeičiama klasės pavadinimu, perduotu kaip argumentas, todėl gaunamas naujas tipo apibrėžimas. Generinis yra gana didelė tema, ir aš čia jos išsamiai neanalizuosiu, o tie, kurie domisi, gali susipažinti su atitinkama informacija.
    Kaip sukurti bendrąją kolekciją?
    Rinkiniams kurti naudojama bendroji klasė Sąrašas pagal System.Collections.Generic vardų sritį<T>, o sintaksė yra tokia:
[mw_shl_code=csharp,true] List<T> ListOfT = naujas List<T>(); [/mw_shl_code]
"T" yra naudojamas tipas, kuris gali būti paprastas tipas, pvz., eilutė, int arba vartotojo apibrėžti tipai. Pažvelkime į konkretų pavyzdį.

Asmens klasė apibrėžiama taip:
[mw_shl_code=csharp,true]klasė Asmuo
{
    privatus styginių _name; Vardas, pavadinimas
    privatus int _age; Amžius

    Asmens objekto kūrimas
    public Person(eilutės vardas, int amžius)
    {
        this._name = Vardas;
        this._age = amžius;
    }

    Vardas, pavadinimas
    viešosios eilutės pavadinimas
    {
        gauti { return _name; }
    }

    Amžius
    viešas int amžius
    {
        gauti { return _age; }
    }
}

//创建Person对象
Asmuo p1 = naujas asmuo ("Zhang San", 30);
Asmuo p2 = naujas asmuo ("Li Si", 20);
Asmuo p3 = naujas asmuo ("Wang Wu", 50);

//创建类型为Person的对象集合
Sąrašas<Person> asmenų = naujas Sąrašas<Person>();

//将Person对象放入集合
asmenų. Pridėti(p1);
asmenų. Pridėti(p2);
asmenų. Pridėti(p3);

//输出第2个人的姓名
Console.Write(asmenys[1]. pavadinimas); [/mw_shl_code]
Kaip matote, bendrosios kolekcijos labai supaprastina kolekcijų diegimo kodą, per kurį galite lengvai sukurti nurodytų tipų kolekcijas. Negana to, bendrosios kolekcijos taip pat teikia galingesnes funkcijas, pažvelkime į rūšiavimą ir paiešką jose.
    Bendrųjų kolekcijų rūšiavimas
    Rūšiavimas pagrįstas palyginimu, o norint rūšiuoti, pirmiausia reikia palyginti. Pavyzdžiui, jei yra du skaičiai 1 ir 2, norėdami juos rūšiuoti, pirmiausia turime palyginti šiuos du skaičius ir rūšiuoti juos pagal palyginimo rezultatus. Jei norite palyginti objektus, situacija yra šiek tiek sudėtingesnė, pavyzdžiui, jei lyginate asmens objektus, galite palyginti pagal vardą ar amžių, todėl reikia nustatyti palyginimo taisykles. Objektas gali turėti kelias palyginimo taisykles, bet tik vieną numatytąją taisyklę, kuri yra įtraukta į objektą apibrėžiančią klasę. Numatytosios palyginimo taisyklės apibrėžiamos metode CompareTo, kuris priklauso IComparable <T>bendrajai sąsajai. Žiūrėkite žemiau esantį kodą:
[mw_shl_code=csharp,true]klasė Asmuo :IComparable<Person>
{
    Palyginkite pagal amžių
    public int CompareTo(Person p)
    {
        grąžinti tai. Amžius - p.Amžius;
    }
}[/mw_shl_code]
Metodo CompareTo parametrai yra kitas to paties tipo objektas, su kuriuo reikia lyginti, grąžinama reikšmė yra int tipas, jei grąžinama reikšmė yra didesnė nei 0, tai reiškia, kad pirmasis objektas yra didesnis už antrąjį objektą, jei grąžinama reikšmė yra mažesnė nei 0, tai reiškia, kad pirmasis objektas yra mažesnis už antrąjį objektą, o jei grąžina 0, abu objektai yra lygūs.
Apibrėžę numatytąsias palyginimo taisykles, galite rūšiuoti rinkinį naudodami rūšiavimo metodą be parametrų, kaip nurodyta toliau:
[mw_shl_code=csharp,true]// Rūšiuoti kolekciją pagal numatytąsias taisykles
asmenų. Rūšiuoti ();

//输出所有人姓名
foreach (Asmuo p asmenimis)
{
    Console.WriteLine(p.Name); Išvesties tvarka yra "Li Si", "Zhang San" ir "Wang Wu"
}[/mw_shl_code]
Praktiškai dažnai reikia rūšiuoti kolekciją pagal įvairias skirtingas taisykles, todėl reikia apibrėžti kitas palyginimo taisykles, kurias galima apibrėžti palyginimo metode, kuris priklauso IComparer <T>bendrajai sąsajai, žiūrėkite šį kodą:
[mw_shl_code=csharp,true]class NameComparer : IComparer<Person>
{
    Saugyklos sekos egzemplioriai
    public static NameComparer Default = new NameComparer();

    Palyginti pagal pavadinimą
    public int Palyginti(Asmuo p1, Asmuo p2)
    {
        grąžinti System.Collections.Comparer.Default.Compare(p1. Vardas, 2 psl. pavadinimas);
    }
}[/mw_shl_code]
Palyginimo metodo parametrai yra du to paties tipo objektai, kuriuos reikia lyginti, o grąžinamos reikšmės yra int tipo, o grąžinamos vertės apdorojimo taisyklės yra tokios pačios kaip metodo CompareTo. Comparer.Default grąžina įtaisytąjį lygintuvo objektą, skirtą palyginti du to paties tipo objektus.
    Štai kaip rūšiuoti rinkinį naudojant šį naujai apibrėžtą lygintuvą:
[mw_shl_code=csharp,true]//Rūšiuoti kolekciją pagal pavadinimą
asmenų. Sort(NameComparer.Default);

//输出所有人姓名
foreach (Asmuo p asmenimis)
{
    Console.WriteLine(p.Name); Išvesties tvarka yra "Li Si", "Wang Wu" ir "Zhang San"
}[/mw_shl_code]
Taip pat galite rūšiuoti rinkinį, visų pirma, apibrėždami metodą, pagal kurį atstovas turi iškviesti palyginimo taisykles saugoti, ir galite naudoti statinį metodą. Žiūrėkite žemiau esantį kodą:
[mw_shl_code=csharp,true]klasė PersonComparison
{
    Palyginti pagal pavadinimą
    public static int Vardas (asmuo p1, asmuo p2)
    {
        grąžinti System.Collections.Comparer.Default.Compare(p1. Vardas, 2 psl. pavadinimas);
    }
}[/mw_shl_code]
Metodo parametrai yra du to paties tipo objektai, kuriuos reikia lyginti, grąžinamos reikšmės yra int tipo, o grąžinamos vertės apdorojimo taisyklė yra tokia pati kaip metodo CompareTo.Tada rūšiuokite rinkinį naudodami integruotą bendrąjį atstovą System.Comparison<T>:
[mw_shl_code=csharp,true] System.Comparison<Person> NameComparison = naujas System.Comparison<Person>(PersonComparison.Name);
asmenų. Sort(NameComparison);

//输出所有人姓名
foreach (Asmuo p asmenimis)
{
    Console.WriteLine(p.Name); Išvesties tvarka yra "Li Si", "Wang Wu" ir "Zhang San"
}[/mw_shl_code]
Galima pastebėti, kad pastarieji du metodai gali rūšiuoti kolekciją pagal nurodytas taisykles, tačiau autorius nori naudoti delegavimo metodą ir gali apsvarstyti galimybę į klasę įtraukti įvairias palyginimo taisykles ir lanksčiai jas pavadinti.
    Bendrųjų kolekcijų paieška
    Ieška yra rasti elementus, atitinkančius konkrečias rinkinio sąlygas, o pagal poreikį galima apibrėžti ir iškviesti kelias paieškos sąlygas. Pirmiausia apibrėžkite paieškos kriterijus taip:
[mw_shl_code=csharp,true]klasės PersonPredicate
{
    Raskite vidutinio amžiaus žmones (vyresnius nei 40 metų)
    viešas statinis bool MidAge(Asmuo p)
    {
        if (p.Amžius >= 40)
            grąžinti tiesa;
        kitaip
            grąžinti klaidingą;
    }
}[/mw_shl_code]
Aukščiau pateikti ieškos kriterijai pateikiami statiniu metodu su Bulio logikos grąžinimo tipu, o rinkinio elementai, atitinkantys tam tikras sąlygas, pateikia teisingą, kitu atveju klaidingą.Tada ieškokite rinkinyje naudodami integruotą bendrąjį delegatą System.Predicate<T>:
[mw_shl_code=csharp,true] System.Predicate<Person> MidAgePredicate = new System.Predicate<Person>(PersonPredicate.MidAge);
Sąrašas<Person> MidAgePersons = asmenys. FindAll(MidAgePredicate);

//输出所有的中年人姓名
foreach (Asmuo p MidAgePersons)
{
    Console.WriteLine(p.Name); Išėjimas "Wang Wu"
}[/mw_shl_code]
Bendrųjų kolekcijų išplėtimas
    Ką daryti, jei norite gauti visų rinkinyje esančių žmonių vardus, atskirtus kableliu?
    Atsižvelgiant į tai, kad vienos klasės funkcionalumas yra ribotas, natūralu galvoti <T>apie sąrašo klasės išplėtimą, kuri taip pat yra klasė, todėl gali būti išplėsta paveldėjimo būdu. Žiūrėkite žemiau esantį kodą:
[mw_shl_code=csharp,true]// Apibrėžkite asmenų rinkimo klasę
klasė Asmenys : Sąrašas<Person>
{
    Gaukite visų kolekcijos narių vardus
    viešoji eilutė GetAllNames()
    {
        jei (šis. Skaičius == 0)
            grąžinti "";

        eilutė val = "";
        foreach (Asmuo p)
        {
            val += p.Name + ",";
        }

        grąžinti val. Substring(0, val. Ilgis - 1);
    }
}

//创建并填充Persons集合
Asmenys PersonCol = nauji asmenys();
PersonCol.Add(p1);
PersonCol.Add(p2);
PersonCol.Add(p3);

//输出所有人姓名
Console.Write(PersonCol.GetAllNames()); Išvestis "Zhang San, Li Si, Wang Wu"[/mw_shl_code]
Santrauka:
    Šiame straipsnyje pagrindinis dėmesys skiriamas generinių vaistų naudojimui C# 2.0 kolekcijoms įgyvendinti, taip pat išplėsti rinkimo funkciją, o tinkamas bendrųjų kolekcijų naudojimas gali sumažinti daug darbo dubliavimo ir žymiai pagerinti kūrimo efektyvumą. Tiesą sakant, rinkiniai yra tik tipiškas generinių vaistų pritaikymas, o jei norite sužinoti daugiau apie generinius vaistus, galite pasikonsultuoti su kita susijusia medžiaga. Tikiuosi, kad šis straipsnis jums buvo naudingas :-)





Ankstesnis:Yra keletas C# kolekcijų apibendrinimų tipų
Kitą:SOS paštu, tikiuosi, kad Dievas padės man, mokyklos mokinio prisijungimo sistemos slaptažodį pamiršo, kaip gauti slaptažodį atgal pagalbos? Ačiū iš anksto
Paskelbta 2014-11-24 11:48:29 |
Pašalinkite nulinį susigrąžinimą
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com