Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 22157|Odpověď: 1

[Zdroj] C# Generický Range Rover (zatáčení)

[Kopírovat odkaz]
Zveřejněno 11.11.2014 8:56:04 | | |
Kolekce jsou důležitým konceptem v OOP a plná podpora kolekcí v C# patří k nejlepším v tomto jazyce.
    Proč používat obecné sady?
    Před C# 2.0 bylo možné kolekce implementovat dvěma hlavními způsoby:
    a. Použijte ArrayList
    Přikládání objektů přímo do ArrayListu je intuitivní, ale protože položky v kolekci jsou typu Object, musíte pokaždé provádět zdlouhavou konverzi typu.
    b. Použití vlastních tříd kolekcí
    Běžnou praxí je zdědit vlastní třídu z abstraktní třídy CollectionBase a implementovat silnou kolekci typů zapouzdřením objektu IList. Tato metoda vyžaduje napsat odpovídající vlastní třídu pro každý typ kolekce, což je hodně práce. Vznik generických kolekcí dobře řeší výše uvedené problémy a k vytvoření sady určitého typu lze použít pouze jeden řádek kódu.
    Co je obecné?
    Generické prvky jsou nové prvky v C# 2.0 (v C++ nazývané šablony), které se používají hlavně k řešení řady podobných problémů. Tento mechanismus umožňuje předat název třídy jako argument k generickému typu a vygenerovat odpovídající objekt. Může být lepší uvažovat o generikách (včetně tříd, rozhraní, metod, delegátů atd.) jako o šablonách, kde je variantní část nahrazena názvem třídy předaným jako argument, což vede k nové definici typu. Obecné téma je poměrně rozsáhlé a nebudu ho zde podrobně analyzovat, a ti, kdo mají zájem, si mohou prohlédnout příslušné informace.
    Jak vytvořit obecnou kolekci?
    Generická třída List pod jmenným prostorem System.Collections.Generic <T>se používá k vytváření kolekcí a syntaxe je následující:
[mw_shl_code=csharp, pravda] <T> List ListOfT = nový List<T>(); [/mw_shl_code]
"T" je typ, který se má použít, což může být jednoduchý typ, jako je string, int nebo uživatelem definované typy. Podívejme se na konkrétní příklad.

Třída Person je definována následovně:
[mw_shl_code=csharp, true] třída Osoba
{
    soukromý strunový _name; Jméno
    soukromý int _age; Stáří

    Vytvořit objekt Person
    public Person(jméno řetězce, int věk)
    {
        this._name= Jméno;
        this._age = Věk;
    }

    Jméno
    veřejné jméno struny
    {
        get { return _name; }
    }

    Stáří
    veřejný int Věk
    {
        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的对象集合
Osoby ze seznamu<Person> = nový Seznam<Person>();

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

//输出第2个人的姓名
Console.Write(persons[1]. Název); [/mw_shl_code]
Jak vidíte, obecné kolekce výrazně zjednodušují implementační kód kolekcí, díky čemuž můžete snadno vytvářet kolekce specifikovaných typů. Nejen to, ale obecné kolekce poskytují i výkonnější funkce, pojďme se podívat na třídění a vyhledávání v nich.
    Třídění generických kolekcí
    Třídění je založeno na srovnávání, a k třídění je nejprve nutné porovnat. Například pokud existují dvě čísla 1 a 2, musíme je nejprve porovnat a seřadit podle výsledků porovnání. Pokud chcete porovnat objekty, situace je trochu složitější, například pokud porovnáváte objekty Osob, můžete porovnat podle jména nebo věku, což vyžaduje určení pravidel porovnání. Objekt může mít více srovnávacích pravidel, ale pouze jedno výchozí pravidlo, které je umístěno do třídy, jež objekt definuje. Výchozí srovnávací pravidla jsou definována metodou CompareTo, která patří do generického rozhraní IComparable<T>. Viz níže uvedený kód:
[mw_shl_code=csharp,true]třída Osoba :IComparable<Person>
{
    Porovnat podle věku
    public int CompareTo(Person p)
    {
        Vrať tohle. Věk - p. Věk;
    }
}[/mw_shl_code]
Parametry metody CompareTo jsou další objekty stejného typu, se kterými se porovnává, vrácená hodnota je typ int, pokud je vrácená hodnota větší než 0, znamená to, že první objekt je větší než druhý objekt, pokud je návratová hodnota menší než 0, znamená to, že první objekt je menší než druhý objekt, a pokud vrátí 0, oba objekty jsou stejné.
Po definování výchozích pravidel porovnání můžete kolekci seřadit pomocí metody Sort bez parametrů, a to následovně:
[mw_shl_code=csharp,true]// Seřadit kolekci podle výchozích pravidel
osobám. sort();

//输出所有人姓名
foreach (Osoba p v osobách)
{
    Console.WriteLine(p.Name); Pořadí výstupů je "Li Si", "Zhang San" a "Wang Wu"
}[/mw_shl_code]
V praxi je často nutné třídit kolekci podle různých pravidel, což vyžaduje definici dalších srovnávacích pravidel, která lze definovat metodou Comprel, která patří do generického rozhraní IComparer<T>, viz následující kód:
[mw_shl_code=csharp,true]třída Názvář : IComparer<Person>
{
    Instance sekvencerů pro ukládání paměti
    public static NameComparer Default = nový NameComparer();

    Porovnat podle jména
    public int Porovnání(Osoba p1, Osoba p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Jméno, str. 2. Název);
    }
}[/mw_shl_code]
Parametry metody Compare jsou dva objekty stejného typu, které se porovnávají, a vrácená hodnota je typu int, přičemž pravidla zpracování vrácené hodnoty jsou stejná jako u metody CompareTo. Comparer.Default vrací vestavěný Comparer objekt pro porovnání dvou objektů stejného typu.
    Zde je návod, jak třídit kolekci pomocí nově definovaného komparátoru:
[mw_shl_code=csharp, true]//Seřadit kolekci podle názvu
osobám. sort(NameComparer.Default);

//输出所有人姓名
foreach (Osoba p v osobách)
{
    Console.WriteLine(p.Name); Pořadí výstupů je "Li Si", "Wang Wu" a "Zhang San"
}[/mw_shl_code]
Můžete také třídit kolekci podle delegování, nejprve definovat metodu, kterou má delegát volat pro ukládání srovnávacích pravidel, a můžete použít statickou metodu. Viz níže uvedený kód:
[mw_shl_code=csharp,true]třída OsobaSrovnání
{
    Porovnat podle jména
    public static int Jméno(Osoba p1, Osoba p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Jméno, str. 2. Název);
    }
}[/mw_shl_code]
Parametry metody jsou dva objekty stejného typu, které se porovnávají – návratová hodnota je typu int a pravidlo zpracování vrácené hodnoty je stejné jako u metody CompareTo.Poté kolekci seřadit pomocí vestavěného systému generických delegátů. Srovnání<T>:
[mw_shl_code=csharp, pravda] System.Comparison<Person> NameComparison = nový System.Comparison<Person>(PersonComparison.Name);
osobám. Sort(NameComparison);

//输出所有人姓名
foreach (Osoba p v osobách)
{
    Console.WriteLine(p.Name); Pořadí výstupů je "Li Si", "Wang Wu" a "Zhang San"
}[/mw_shl_code]
Je vidět, že poslední dvě metody mohou třídit sbírku podle specifikovaných pravidel, ale autor dává přednost použití metody delegace a může zvážit zařazení různých srovnávacích pravidel do třídy a jejich volání flexibilně.
    Vyhledávání generických sbírek
    Vyhledávání slouží k nalezení položek, které splňují specifické podmínky ze sbírky, a podle potřeby lze definovat a volat více vyhledávacích podmínek. Nejprve definujte kritéria vyhledávání následovně:
[mw_shl_code=csharp,true]třída PersonPredikát
{
    Najděte lidi středního věku (nad 40 let)
    veřejný statický bool MidAge (Osoba p)
    {
        pokud (p.Věk >= 40)
            return true;
        jinak
            return false;
    }
}[/mw_shl_code]
Výše uvedená kritéria vyhledávání jsou umístěna statickou metodou s Booleovským typem návratu a položky v kolekci, které splňují určité podmínky, vracejí pravdu, jinak nepravdu.Poté prohledejte kolekci pomocí vestavěného generického systému delegátů. Predikát<T>:
[mw_shl_code=csharp, pravda] <Person> System.PredikatéMidAgePredikát = nový System.Predikat<Person>(OsobaPredikat.StředníVěk);
Seznam<Person> MidAgePersons = osoby. FindAll(MidAgePredicate);

//输出所有的中年人姓名
foreach (Osoba p v MidAgePersons)
{
    Console.WriteLine(p.Name); Výstup "Wang Wu"
}[/mw_shl_code]
Rozšíření obecných kolekcí
    Co když chcete získat jména všech lidí v sadě, oddělená čárkou?
    Vzhledem k tomu, že funkčnost, kterou může jedna třída poskytnout, je omezená, je přirozené uvažovat <T>o rozšíření třídy List, která je také třídou a tudíž ji lze rozšířit dědičností. Viz níže uvedený kód:
[mw_shl_code=csharp,true]// Definujte třídu kolekce Persons
Osoby třídy : Seznam<Person>
{
    Získejte jména všech ve sbírce
    public string GetAllNames()
    {
        pokud (toto. Počet == 0)
            return "";

        struna val = "";
        foreach (Osoba p v tomto případě)
        {
            val += p.Name + ",";
        }

        Vrať, Val. Podřetězec(0, val. Délka - 1);
    }
}

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

//输出所有人姓名
Console.Write(PersonCol.GetAllNames()); Výstup "Zhang San, Li Si, Wang Wu"[/mw_shl_code]
Shrnutí:
    Tento článek se zaměřuje na využití generik v C# 2.0 pro implementaci kolekcí, stejně jako na rozšíření funkce kolekcí, přičemž správné použití obecných kolekcí může snížit množství duplicit práce a výrazně zlepšit efektivitu vývoje. Ve skutečnosti jsou sady jen typickou aplikací generik, a pokud chcete vědět více o generiku, můžete se podívat na jiné relevantní materiály. Doufám, že vám tento článek pomohl :-)





Předchozí:Existuje několik typů rollupů pro kolekce v C#
Další:SOS příspěvek, doufám, že mi Bůh pomůže, přihlašovací heslo do systému školních studentů zapomenuto, jak získat heslo zpět pro pomoc? Předem děkuji
Zveřejněno 24.11.2014 11:48:29 |
Eliminujte nulové obnovy
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com