Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 22157|Odpoveď: 1

[Zdroj] C# Generický Range Rover (zákruta)

[Kopírovať odkaz]
Zverejnené 11. 11. 2014 8:56:04 | | |
Kolekcie sú dôležitým konceptom v OOP a plná podpora kolekcií v C# patrí medzi najlepšie v jazyku.
    Prečo používať generické sety?
    Pred C# 2.0 bolo možné kolekcie implementovať dvoma hlavnými spôsobmi:
    a. Použite ArrayList
    Vkladanie objektov priamo do ArrayListu je intuitívne, ale keďže položky v kolekcii sú typu Object, musíte zakaždým robiť zdĺhavú konverziu typu.
    b. Použiť vlastné triedy kolekcií
    Bežnou praxou je zdediť vlastnú triedu z abstraktnej triedy CollectionBase a implementovať silnú typovú kolekciu zapuzdrením objektu IList. Táto metóda vyžaduje napísanie zodpovedajúcej vlastnej triedy pre každý typ kolekcie, čo je veľa práce. Vznik generických kolekcií dobre rieši vyššie uvedené problémy a na vytvorenie množiny určeného typu možno použiť iba jeden riadok kódu.
    Čo je generikum?
    Generiká sú nové prvky v C# 2.0 (v C++ nazývané šablóny), ktoré sa používajú najmä na riešenie série podobných problémov. Tento mechanizmus umožňuje odovzdať názov triedy ako argument generickému typu a vygenerovať príslušný objekt. Môže byť lepšie považovať generiká (vrátane tried, rozhraní, metód, delegátov atď.) ako šablóny, kde je variantná časť nahradená názvom triedy odovzdaným ako argument, čo vedie k novej definícii typu. Všeobecná téma je pomerne rozsiahla a nebudem ju tu podrobne analyzovať, a tí, ktorí majú záujem, si môžu pozrieť relevantné informácie.
    Ako vytvorím generickú kolekciu?
    Generická trieda List pod menným priestorom System.Collections.Generic <T>sa používa na vytváranie kolekcií a jej syntax je nasledovná:
[mw_shl_code=csharp, pravda] List<T> ListOfT = nový List<T>(); [/mw_shl_code]
"T" je typ, ktorý sa má použiť, a môže to byť jednoduché typy, ako string, int alebo používateľom definované typy. Pozrime sa na konkrétny príklad.

Trieda Person je definovaná nasledovne:
[mw_shl_code=csharp, true] trieda Osoba
{
    súkromné strunové _name; Meno
    súkromný int _age; Vek

    Vytvoriť objekt Person
    public Person (meno reťazca, int vek)
    {
        this._name= Meno;
        this._age = Vek;
    }

    Meno
    verejný názov struny
    {
        get { return _name; }
    }

    Vek
    verejný int Vek
    {
        get { return _age; }
    }
}

//创建Person对象
Osoba p1 = nová osoba ("Zhang San", 30);
Osoba p2 = nová osoba ("Li Si", 20);
Osoba p3 = nová osoba ("Wang Wu", 50);

//创建类型为Person的对象集合
List<Person> persons = nový List<Person>();

//将Person对象放入集合
osoby. Add(p1);
osoby. Add(p2);
osoby. Add(p3);

//输出第2个人的姓名
Console.Write(osoby[1]. Meno); [/mw_shl_code]
Ako vidíte, generické kolekcie výrazne zjednodušujú implementačný kód kolekcií, vďaka čomu môžete jednoducho vytvárať kolekcie špecifikovaných typov. Nielen to, ale generické kolekcie poskytujú aj výkonnejšie funkcie, pozrime sa na triedenie a vyhľadávanie v nich.
    Triedenie generických zbierok
    Triedenie je založené na porovnávaní, a na zoradenie musíte najprv porovnať. Napríklad, ak sú dve čísla 1 a 2, na ich zoradenie musíme najprv porovnať tieto dve čísla a zoradiť ich podľa výsledkov porovnania. Ak chcete porovnávať objekty, situácia je trochu zložitejšia, napríklad ak porovnávate objekty osôb, môžete porovnávať podľa mena alebo veku, čo vyžaduje určenie pravidiel porovnania. Objekt môže mať viacero porovnávacích pravidiel, ale len jedno predvolené pravidlo, ktoré je umiestnené v triede, ktorá objekt definuje. Predvolené pravidlá porovnávania sú definované v metóde CompareTo, ktorá patrí do <T>generického rozhrania IComparable. Pozrite si kód nižšie:
[mw_shl_code=csharp,true] trieda Osoba :ICporovnateľná<Person>
{
    Porovnajte podľa veku
    public int CompareTo(Person p)
    {
        Vráť toto. Vek - p. Vek;
    }
}[/mw_shl_code]
Parametre metódy CompareTo sú ďalší objekt rovnakého typu, s ktorým sa porovnáva, návratová hodnota je int typ, ak je návratová hodnota väčšia ako 0, znamená to, že prvý objekt je väčší ako druhý objekt, ak je návratová hodnota menšia ako 0, znamená to, že prvý objekt je menší ako druhý objekt, a ak vráti 0, oba objekty sú rovnaké.
Po definovaní predvolených pravidiel porovnania môžete kolekciu zoradiť pomocou metódy Sort bez parametrov, nasledovne:
[mw_shl_code=csharp,true]// Zoradiť kolekciu podľa predvolených pravidiel
osoby. sort();

//输出所有人姓名
foreach (Osoba p v osobách)
{
    Console.WriteLine(p.Name); Poradie výstupov je "Li Si", "Zhang San" a "Wang Wu"
}[/mw_shl_code]
V praxi je často potrebné zoradiť kolekciu podľa rôznych pravidiel, čo vyžaduje definíciu ďalších porovnávacích pravidiel, ktoré možno definovať metódou Compare patriacou do <T>generického rozhrania IComparer, pozrite si prosím nasledujúci kód:
[mw_shl_code=csharp,true] trieda NázvyKomparer : IComparer<Person>
{
    Inštancie pamäťových sekvencerov
    public static NameComparer Default = nový NameComparer();

    Porovnať podľa mena
    public int Compare(Osoba p1, Osoba p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Meno, str. 2. Meno);
    }
}[/mw_shl_code]
Parametre metódy Compare sú dva objekty rovnakého typu, ktoré sa majú porovnať, a vrátená hodnota je typu int, pričom pravidlá spracovania vrátenej hodnoty sú rovnaké ako pri metóde CompareTo. Comparer.Default vráti zabudovaný Comparer objekt na porovnanie dvoch objektov rovnakého typu.
    Tu je návod, ako zoradiť kolekciu pomocou tohto novo definovaného komparátora:
[mw_shl_code=csharp,true]//Zoradiť kolekciu podľa názvu
osoby. Sort(NameComparer.Default);

//输出所有人姓名
foreach (Osoba p v osobách)
{
    Console.WriteLine(p.Name); Výstupné poradie je "Li Si", "Wang Wu" a "Zhang San"
}[/mw_shl_code]
Môžete tiež triediť kolekciu delegovaním, najprv definovať metódu, ktorú má delegát volať na uloženie porovnávacích pravidiel, a použiť statickú metódu. Pozrite si kód nižšie:
[mw_shl_code=csharp,true]trieda Porovnanie osôb
{
    Porovnať podľa mena
    public static int Meno(Osoba p1, Osoba p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Meno, str. 2. Meno);
    }
}[/mw_shl_code]
Parametre metódy sú dva objekty rovnakého typu, ktoré sa porovnávajú, vrátená hodnota je typu int a pravidlo spracovania vrátenej hodnoty je rovnaké ako pri metóde CompareTo.Potom zoradia kolekciu pomocou zabudovaného generického systému delegátov. Porovnanie<T>:
[mw_shl_code=csharp, pravda] System.Comparison<Person> NameComparison = nový System.Comparison<Person>(PersonComparison.Name);
osoby. Sort(NameComparison);

//输出所有人姓名
foreach (Osoba p v osobách)
{
    Console.WriteLine(p.Name); Výstupné poradie je "Li Si", "Wang Wu" a "Zhang San"
}[/mw_shl_code]
Je zrejmé, že posledné dve metódy môžu triediť kolekciu podľa špecifikovaných pravidiel, ale autor uprednostňuje použitie metódy delegácie a môže zvážiť zaradenie rôznych porovnávacích pravidiel do triedy a následné ich volanie flexibilne.
    Vyhľadávanie všeobecných zbierok
    Vyhľadávanie slúži na nájdenie položiek, ktoré spĺňajú konkrétne podmienky zo zbierky, a podľa potreby je možné definovať a volať viacero vyhľadávacích podmienok. Najprv definujte kritériá vyhľadávania nasledovne:
[mw_shl_code=csharp,true]trieda PersonPredikát
{
    Nájdite ľudí stredného veku (nad 40 rokov)
    verejný statický bool MidAge (Osoba p)
    {
        ak (p.Vek >= 40)
            return true;
        else
            return false;
    }
}[/mw_shl_code]
Vyššie uvedené kritériá vyhľadávania sú umiestnené statickou metódou s Booleovským typom návratu a položky v kolekcii, ktoré spĺňajú určité podmienky, vracajú pravdu, inak nepravdu.Potom prehľadajte kolekciu cez zabudovaný generický systém delegátov. Predikáte<T>:
[mw_shl_code=csharp, pravda] System.Predikát<Person> MidAgePredikát = nový System.Predicate<Person>(PersonPredicate.MidAge);
List<Person> MidAgePersons = osoby. FindAll(MidAgePredicate);

//输出所有的中年人姓名
foreach (Osoba p v MidAgePersons)
{
    Console.WriteLine(p.Name); Výstup "Wang Wu"
}[/mw_shl_code]
Rozšírenie všeobecných zbierok
    Čo ak chcete získať mená všetkých ľudí v sade, oddelené čiarkou?
    Keďže funkcionalita, ktorú môže poskytnúť jedna trieda, je obmedzená, je prirodzené uvažovať <T>o rozšírení triedy List, ktorá je tiež triedou a teda môže byť rozšírená dedičnosťou. Pozrite si kód nižšie:
[mw_shl_code=csharp,true]// Definujte triedu kolekcie Persons
trieda Osoby : Zoznam<Person>
{
    Získajte mená všetkých v zbierke
    public string GetAllNames()
    {
        ak (toto. Count == 0)
            return "";

        reťazec val = "";
        foreach (Osoba p v tomto)
        {
            val += p.Name + ",";
        }

        Vráť Val. Substring(0, val. Dĺžka - 1);
    }
}

//创建并填充Persons集合
Osoby OsobaCol = nové Osoby();
OsobaCol.Add(p1);
OsobaCol.Add(p2);
OsobaCol.Add(s3);

//输出所有人姓名
Console.Write(PersonCol.GetAllNames()); Výstup "Zhang San, Li Si, Wang Wu"[/mw_shl_code]
Zhrnutie:
    Tento článok sa zameriava na použitie generík v C# 2.0 na implementáciu kolekcií, ako aj na rozšírenie funkcie kolekcií, pričom správne používanie generických kolekcií môže znížiť množstvo duplicity práce a výrazne zlepšiť efektivitu vývoja. V skutočnosti sú sady len typickou aplikáciou generík, a ak chcete vedieť viac o generikách, môžete sa pozrieť na iné relevantné materiály. Dúfam, že vám tento článok pomohol :-)





Predchádzajúci:Existuje niekoľko typov rollupov pre kolekcie v C#
Budúci:SOS príspevok, dúfam, že mi Boh pomôže, školské prihlasovacie heslo do systému zabudnuté, ako získať heslo späť pre pomoc? Vopred ďakujem
Zverejnené 24. 11. 2014 11:48:29 |
Eliminujte nulové zotavenia
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com