Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 22157|Odpowiedź: 1

[Źródło] C# Uniwersalny Range Rover (Skręt)

[Skopiuj link]
Opublikowano 11.11.2014 08:56:04 | | |
Kolekcje są ważnym pojęciem w OOP, a pełne wsparcie dla kolekcji w C# to jedna z najlepszych w tym języku.
    Dlaczego używać zestawów uniwersalnych?
    Przed C# 2.0 kolekcje mogły być implementowane na dwa główne sposoby:
    a. Użyj ArrayList
    Umieszczanie obiektów bezpośrednio w ArrayList jest intuicyjne, ale ponieważ elementy w kolekcji mają typ Object, za każdym razem musisz robić żmudną konwersję typów.
    b. Używaj niestandardowych klas kolekcji
    Powszechną praktyką jest dziedziczenie niestandardowej klasy abstrakcyjnej CollectionBase i implementacja silnej kolekcji typów poprzez enkapsulację obiektu IList. Ta metoda wymaga napisania odpowiadającej mu niestandardowej klasy dla każdego typu kolekcji, co jest sporo pracy. Pojawienie się zbiorów ogólnych dobrze rozwiązuje powyższe problemy, a do stworzenia zbioru określonego typu można użyć tylko jednej linii kodu.
    Co to jest generyczne?
    Generyki to nowe elementy w C# 2.0 (w C++ zwane szablonami), które są głównie używane do rozwiązywania serii podobnych problemów. Mechanizm ten pozwala na przekazanie nazwy klasy jako argumentu do typu ogólnego i generowanie odpowiadającego mu obiektu. Lepiej myśleć o generykach (w tym klasach, interfejsach, metodach, delegatach itp.) jako o szablonach, gdzie część wariantu jest zastępowana nazwą klasy przekazywaną jako argument, co skutkuje nową definicją typu. Temat ogólny to stosunkowo obszerny temat i nie będę go tu szczegółowo analizować, a zainteresowani mogą skonsultować się z odpowiednimi informacjami.
    Jak stworzyć ogólną kolekcję?
    Klasa generyczna List w przestrzeni nazw System.Collections.Generic <T>jest używana do tworzenia kolekcji, a składnia jest następująca:
[mw_shl_code=csharp, true] <T> List ListOfT = nowa List<T>(); [/mw_shl_code]
"T" to typ, którego należy użyć, a może to być proste typy, takie jak string, int lub typy zdefiniowane przez użytkownika. Przyjrzyjmy się konkretnemu przykładowi.

Klasa Person jest zdefiniowana następująco:
[mw_shl_code=csharp, true] Osoba klasy
{
    prywatna _name; Nazwa
    prywatny _age; Wiek

    Stwórz obiekt Person
    Osoba publiczna (nazwa ciągu, int wiek)
    {
        this._name= Imię;
        this._age = wiek;
    }

    Nazwa
    publiczna nazwa struny
    {
        get { return _name; }
    }

    Wiek
    publicznie int Wiek
    {
        get { return _age; }
    }
}

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

//创建类型为Person的对象集合
Osoby z listy<Person> = nowa <Person>Lista();

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

//输出第2个人的姓名
Console.Write(persons[1]. Nazwa); [/mw_shl_code]
Jak widać, kolekcje ogólne znacznie upraszczają kod implementacyjny kolekcji, dzięki czemu można łatwo tworzyć kolekcje określonych typów. Co więcej, kolekcje generyczne oferują też potężniejsze funkcje, przyjrzyjmy się sortowaniu i wyszukiwaniu w nich.
    Sortowanie zbiorów ogólnych
    Sortowanie opiera się na porównywaniu, a aby sortować, najpierw trzeba porównać. Na przykład, jeśli są dwie liczby 1 i 2, aby je posortować, najpierw musimy je porównać i posortować według wyników porównania. Jeśli chcesz porównać obiekty, sytuacja jest nieco bardziej skomplikowana – na przykład, jeśli porównasz obiekty Osoby, możesz porównać według imienia lub wieku, co wymaga określenia reguł porównania. Obiekt może mieć wiele reguł porównawczych, ale tylko jedną domyślną regułę, która jest umieszczona w klasie definiującej obiekt. Domyślne reguły porównania są zdefiniowane w metodzie CompareTo, która należy do <T>ogólnego interfejsu IComparable. Zobacz kod poniżej:
[mw_shl_code=csharp, true] Osoba klasy: Można porównać<Person>
{
    Porównaj według wieku
    public int CompareTo(Person p)
    {
        Oddaj to. Wiek - p.Wiek;
    }
}[/mw_shl_code]
Parametry metody CompareTo to inny obiekt tego samego typu do porównania, wartość zwrotu to typ int, jeśli wartość zwrotu jest większa niż 0, oznacza to, że pierwszy obiekt jest większy od drugiego, jeśli wartość zwrotu jest mniejsza niż 0, oznacza to, że pierwszy obiekt jest mniejszy od drugiego, a jeśli zwraca 0, oba obiekty są równe.
Po zdefiniowaniu domyślnych reguł porównania możesz sortować kolekcję metodą Sort bez parametrów, w następujący sposób:
[mw_shl_code=csharp,true]// Sortuj kolekcję według domyślnych reguł
osoby. sort();

//输出所有人姓名
foreach (Osoba p w osobach)
{
    Console.WriteLine(p.Name); Kolejność produkcji to "Li Si", "Zhang San" i "Wang Wu"
}[/mw_shl_code]
W praktyce często konieczne jest sortowanie kolekcji według różnych reguł, co wymaga definicji innych reguł porównawczych, które można zdefiniować metodą Compare należącą do ogólnego interfejsu IComparer<T>, proszę zobaczyć następujący kod:
[mw_shl_code=csharp,true] Porównawca nazw klasy: IComparer<Person>
{
    Instancje sekwencerów pamięci masowej
    publiczny statyczny NameComparer Domyślny = nowy NameComparer();

    Porównaj według nazwy
    publiczna int Porównaj (Osoba p1, Osoba p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Imię, s. 2. Nazwa);
    }
}[/mw_shl_code]
Parametry metody Compare to dwa obiekty tego samego typu do porównania, a wartość zwrotu to typ int, a reguły przetwarzania wartości zwrotnej są takie same jak w metodzie CompareTo. Comparer.Default zwraca wbudowany obiekt Comparer do porównywania dwóch obiektów tego samego typu.
    Oto jak posortować kolekcję za pomocą tego nowo zdefiniowanego komparatora:
[mw_shl_code=csharp,true]//Sortuj kolekcję według nazwy
osoby. sort(NameComparer.Default);

//输出所有人姓名
foreach (Osoba p w osobach)
{
    Console.WriteLine(p.Name); Kolejność produkcji to "Li Si", "Wang Wu" i "Zhang San"
}[/mw_shl_code]
Możesz też sortować kolekcję przez delegowanie, najpierw zdefiniować metodę, którą delegat ma wywołać do przechowywania reguł porównawczych, a także użyć metody statycznej. Zobacz kod poniżej:
[mw_shl_code=csharp,true] Osoba klasaPorównanie
{
    Porównaj według nazwy
    publiczny statyczny int Imię (Osoba p1, Osoba p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Imię, s. 2. Nazwa);
    }
}[/mw_shl_code]
Parametry metody to dwa obiekty tego samego typu, które mają być porównywane, wartość zwracana to typ int, a reguła przetwarzania wartości zwrotnej jest taka sama jak w metodzie CompareTo.Następnie sortuje kolekcję za pomocą wbudowanego systemu delegatów generycznych. Porównanie<T>:
[mw_shl_code=csharp, true] System.Comparison<Person> NameComparison = nowy System.Comparison<Person>(PersonComparison.Name);
osoby. sort(Porównanie nazwy);

//输出所有人姓名
foreach (Osoba p w osobach)
{
    Console.WriteLine(p.Name); Kolejność produkcji to "Li Si", "Wang Wu" i "Zhang San"
}[/mw_shl_code]
Widać, że dwie ostatnie metody mogą sortować kolekcję według określonych reguł, ale autor woli użyć metody delegacji i może rozważyć umieszczenie różnych reguł porównawczych w klasie, a następnie ich elastyczne wywoływanie.
    Wyszukiwanie zbiorów generycznych
    Wyszukiwanie polega na znalezieniu elementów spełniających określone warunki z kolekcji, a wiele warunków wyszukiwania można zdefiniować i wywołać w razie potrzeby. Po pierwsze, zdefiniuj kryteria wyszukiwania w następujący sposób:
[mw_shl_code=csharp,true]klasa PersonPredykat.
{
    Znajdź osoby w średnim wieku (powyżej 40 lat)
    publiczny statyczny bool MidAge (Osoba p)
    {
        jeśli (p.Wiek >= 40)
            return true;
        else
            return false;
    }
}[/mw_shl_code]
Powyższe kryteria wyszukiwania są umieszczone w metodzie statycznej z typem zwrotu typu Boole'a, a elementy w kolekcji spełniające określone warunki zwracają prawdę, w przeciwnym razie fałszywe.Następnie przeszukaj kolekcję za pomocą wbudowanego systemu delegatów generycznych. Predykat<T>:
[mw_shl_code=csharp, true] System.Predicate<Person> MidAgePredykat = nowy System.Predicate<Person>(PersonPredicate.MidAge);
List<Person> MidAgePersons = osoby. FindAll(MidAgePredicate);

//输出所有的中年人姓名
foreach (Osoba p w MidAgePersons)
{
    Console.WriteLine(p.Name); Wyjście "Wang Wu"
}[/mw_shl_code]
Rozszerzenie zbiorów ogólnych
    A co jeśli chcesz mieć imiona wszystkich osób w zestawie, oddzielone przecinkami?
    Biorąc pod uwagę, że funkcjonalność, jaką może zapewnić pojedyncza klasa, jest ograniczona, naturalne jest myślenie <T>o rozszerzeniu klasy List, która również jest klasą i dlatego może być rozszerzana przez dziedziczenie. Zobacz kod poniżej:
[mw_shl_code=csharp,true]// Zdefiniuj klasę kolekcji Persons
Osoby klasy : Lista<Person>
{
    Zdobądź nazwiska wszystkich członków kolekcji
    public string GetAllNames()
    {
        jeśli (to. Count == 0)
            return "";

        struna val = "";
        foreach (Osoba p w tym przypadku)
        {
            wartość += p.Name + ",";
        }

        Wróć Val. Podciąg(0, val. Długość - 1);
    }
}

//创建并填充Persons集合
Osoby OsobyCol = nowe Osoby();
OsobaCol.Add(p1);
OsobaCol.Add(p2);
OsobaCol.Add(s.3);

//输出所有人姓名
Console.Write(PersonCol.GetAllNames()); Wyjście "Zhang San, Li Si, Wang Wu"[/mw_shl_code]
Podsumowanie:
    Niniejszy artykuł koncentruje się na wykorzystaniu generyków w C# 2.0 do implementacji kolekcji, a także na rozszerzeniu funkcji kolekcji, a właściwe wykorzystanie kolekcji generycznych może ograniczyć duplikowanie pracy i znacznie poprawić efektywność rozwoju. W rzeczywistości zestawy to typowe zastosowanie generyków, a jeśli chcesz dowiedzieć się więcej o generykach, możesz skorzystać z innych istotnych materiałów. Mam nadzieję, że ten artykuł był dla Ciebie pomocny :-)





Poprzedni:Istnieje kilka typów rollupów dla kolekcji w C#
Następny:Post SOS, mam nadzieję, że Bóg mi pomoże, zapomniano hasła do systemu do logowania ucznia szkoły, jak odzyskać hasło, żeby pomóc? Z góry dziękuję
Opublikowano 24.11.2014 11:48:29 |
Eliminacja zerowych odzysków
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com