Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 22157|Відповідь: 1

[Джерело] C# Generic Range Rover (поворот)

[Копіювати посилання]
Опубліковано 11.11.2014 08:56:04 | | |
Колекції — важлива концепція в ООП, а повна підтримка колекцій на C# — одна з найкращих у мові.
    Навіщо використовувати універсальні набори?
    До виходу C# 2.0 колекції можна було реалізувати двома основними способами:
    a. Використання ArrayList
    Додавання об'єктів безпосередньо до ArrayList інтуїтивно зрозуміле, але оскільки елементи колекції мають тип Object, кожного разу доводиться виконувати нудну конверсію типів.
    b. Використовуйте власні класи колекції
    Поширеною практикою є успадкування власного класу з абстрактного класу CollectionBase і реалізація сильної колекції типів шляхом інкапсуляції об'єкта IList. Цей метод вимагає написання відповідного кастомного класу для кожного типу колекції, що є великою роботою. Поява загальних колекцій добре вирішує вищезазначені проблеми, і лише один рядок коду може бути використаний для створення набору заданого типу.
    Що таке загальне?
    Дженерики — це нові елементи в C# 2.0 (у C++ називаються шаблонами), які переважно використовуються для розв'язання низки подібних задач. Цей механізм дозволяє передавати ім'я класу як аргумент до загального типу і генерувати відповідний об'єкт. Можливо, краще розглядати узагальнення (включаючи класи, інтерфейси, методи, делегати тощо) як шаблони, де варіантна частина замінюється на ім'я класу, передане як аргумент, що призводить до нового визначення типу. Дженерик — це відносно велика тема, і я не буду тут детально її аналізувати, а зацікавлені можуть звернутися до відповідної інформації.
    Як створити універсальну колекцію?
    Генеричний клас List у просторі імен System.Collections.Generic <T>використовується для створення колекцій, а синтаксис виглядає так:
[mw_shl_code=csharp, правда] List<T> ListOfT = новий List<T>(); [/mw_shl_code]
«T» — це тип, який слід використовувати, і це можуть бути прості типи, такі як string, int або user-defined types. Давайте розглянемо конкретний приклад.

Клас Person визначається наступним чином:
[mw_shl_code=csharp,true]класна особа
{
    приватний струнний _name; Ім'я
    Private int _age; Вік

    Створити об'єкт Person
    публічна особа (ім'я рядка, інтелектуальний вік)
    {
        this._name= Ім'я;
        this._age = Вік;
    }

    Ім'я
    Публічна назва рядка
    {
        get { return _name; }
    }

    Вік
    публічний міжнародний вік
    {
        get { return _age; }
    }
}

//创建Person对象
Особа p1 = нова особа ("Чжан Сан", 30);
Особа p2 = нова Особа ("Лі Сі", 20);
Особа p3 = нова особа ("Ван Ву", 50);

//创建类型为Person的对象集合
<Person> Особи у списку = новий List<Person>();

//将Person对象放入集合
особи. Add(p1);
особи. Add(p2);
особи. Add(p3);

//输出第2个人的姓名
Console.Write(persons[1]. Назва); [/mw_shl_code]
Як бачите, загальні колекції значно спрощують код реалізації колекцій, завдяки чому можна легко створювати колекції певних типів. Більше того, універсальні колекції також надають потужніші функції, давайте розглянемо сортування та пошук у них.
    Сортування генеричних колекцій
    Сортування базується на порівнянні, і для сортування спочатку потрібно порівняти. Наприклад, якщо є два числа 1 і 2, щоб їх відсортувати, спочатку потрібно порівняти ці два числа і відсортувати за результатами порівняння. Якщо ви хочете порівнювати об'єкти, ситуація трохи складніша: наприклад, якщо порівнювати об'єкти Person, можна порівнювати за іменем або віком, що вимагає визначення правил порівняння. Об'єкт може мати кілька правил порівняння, але лише одне правило за замовчуванням, яке розміщується в класі, що визначає об'єкт. Стандартні правила порівняння визначаються у методі CompareTo, який належить <T>до універсального інтерфейсу IComparable. Дивіться код нижче:
[mw_shl_code=csharp,true]клас Особа :IComparable<Person>
{
    Порівняйте за віком
    public int CompareTo(Особа p)
    {
        Поверни це. Вік — п.Вік;
    }
}[/mw_shl_code]
Параметри методу CompareTo — це ще один об'єкт того ж типу, з яким слід порівнювати: повернене значення — int типу, якщо повернене значення більше за 0, це означає, що перший об'єкт більший за другий, якщо повернене значення менше 0 — перший об'єкт менший за другий, а якщо повертає 0 — обидва об'єкти рівні.
Після визначення стандартних правил порівняння ви можете відсортувати колекцію за допомогою методу Sort без параметрів, наступним чином:
[mw_shl_code=csharp,true]// Відсортувати колекцію за стандартними правилами
особи. Sort();

//输出所有人姓名
foreach (Особа p в особах)
{
    Console.WriteLine(p.Name); Порядок виходу: «Li Si», «Zhang San» та «Wang Wu»
}[/mw_shl_code]
На практиці часто необхідно сортувати колекцію за різними правилами, що вимагає визначення інших правил порівняння, які можна визначити в методі Compare, що належить <T>до універсального інтерфейсу IComparer, див. наступний код:
[mw_shl_code=csharp,true]class NameComparer : IComparer<Person>
{
    Екземпляри секвенсорів зберігання
    публічний статичний NameComparer Default = новий NameComparer();

    Порівняйте за назвою
    public int Compare (Особа p1, Особа p2)
    {
        повернути System.Collections.Comparer.Default.Compare(p1. Ім'я, стор. 2. Назва);
    }
}[/mw_shl_code]
Параметри методу Compare — це два об'єкти однакового типу, які потрібно порівняти, а повернене значення має int, а правила обробки поверненого значення збігаються з правилами CompareTo. Comparer.Default повертає вбудований об'єкт Comparer для порівняння двох об'єктів одного типу.
    Ось як відсортувати колекцію за допомогою цього нововизначеного порівнятеля:
[mw_shl_code=csharp,true]//Відсортувати колекцію за назвою
особи. Sort(NameComparer.Default);

//输出所有人姓名
foreach (Особа p в особах)
{
    Console.WriteLine(p.Name); Порядок виходу: «Li Si», «Wang Wu» та «Zhang San»
}[/mw_shl_code]
Ви також можете відсортувати колекцію, делегувавши, перш за все, визначити метод, який делегат має викликати для зберігання правил порівняння, і використовувати статичний метод. Дивіться код нижче:
[mw_shl_code=csharp,true]клас PersonComparison
{
    Порівняйте за назвою
    публічний статичний int Ім'я (Особа p1, особа p2)
    {
        повернути System.Collections.Comparer.Default.Compare(p1. Ім'я, стор. 2. Назва);
    }
}[/mw_shl_code]
Параметри методу — це два об'єкти одного типу, які потрібно порівняти, повернене значення має тип int, а правило обробки поверненого значення збігається з правилом методу CompareTo.Потім відсортуйте колекцію через вбудований загальний делегат System. <T>Порівняння:
[mw_shl_code=csharp, правда] <Person> System.Comparison NameComparison = нова System.Comparison<Person>(PersonComparison.Name);
особи. Sort(NameComparison);

//输出所有人姓名
foreach (Особа p в особах)
{
    Console.WriteLine(p.Name); Порядок виходу: «Li Si», «Wang Wu» та «Zhang San»
}[/mw_shl_code]
Видно, що останні два методи можуть сортувати колекцію відповідно до зазначених правил, але автор віддає перевагу делегованому методу і може розглянути можливість розміщення різних правил порівняння в класі, а потім гнучкого їх виклику.
    Пошук загальних колекцій
    Пошук полягає у пошуку предметів, які відповідають конкретним умовам із колекції, і можна визначити та викликати кілька умов пошуку за потреби. Спочатку визначте критерії пошуку наступним чином:
[mw_shl_code=csharp,true]клас Особа Предикат
{
    Знайдіть людей середнього віку (старше 40)
    публічний статичний бул, MidAge(Особа p)
    {
        якщо (с. Вік >= 40)
            Повернення True;
        інше
            повернення хибно;
    }
}[/mw_shl_code]
Вищезазначені критерії пошуку розміщуються у статичному методі з булевим типом повернення, і елементи колекції, що відповідають певним умовам, повертають істинно, інакше хибне.Потім пошук у колекції через вбудований загальний делегат System.Predicate<T>:
[mw_shl_code=csharp, правда] System.Предикат<Person> середнього віку Предикат = нова <Person>Система.Предикат (PersonPredicate.MidAge);
Список<Person> MidAgePersons = особи. FindAll(Середньовіковий предикат);

//输出所有的中年人姓名
foreach (Особа p у MidAgePersons)
{
    Console.WriteLine(p.Name); Вихід «Wang Wu»
}[/mw_shl_code]
Розширення загальних колекцій
    А що, якщо ви хочете дізнатися імена всіх людей у наборі, розділені комою?
    Враховуючи, що функціональність, яку може надати один клас, обмежена, природно розглядати <T>розширення класу List, який також є класом і, отже, може бути розширений шляхом спадкування. Дивіться код нижче:
[mw_shl_code=csharp,true]// Визначити клас колекції Persons
Особи класу : Список<Person>
{
    Дізнайтеся імена всіх із колекції
    публічний рядок GetAllNames()
    {
        якщо (це. Кількість == 0)
            повернутися """;

        String val = "";
        foreach (Особа p у цьому)
        {
            val += p.Name + ",";
        }

        Поверніть Вал. Підрядка(0, val. Довжина — 1);
    }
}

//创建并填充Persons集合
Persons PersonCol = нові особи();
PersonCol.Add(p1);
PersonCol.Add(стор. 2);
PersonCol.Add(p3);

//输出所有人姓名
Console.Write(PersonCol.GetAllNames()); Вихід «Чжан Сан, Лі Сі, Ван Ву»[/mw_shl_code]
Резюме:
    Ця стаття зосереджена на використанні дженериків у C# 2.0 для реалізації колекцій, а також розширенні функції колекцій, і правильне використання генеричних колекцій може зменшити багато дублювання роботи та значно підвищити ефективність розробки. Насправді набори — це типове застосування дженериків, і якщо ви хочете дізнатися більше про дженериків, можете звернутися до інших релевантних матеріалів. Сподіваюся, ця стаття була для вас корисною :-)





Попередній:Існує кілька типів збірок для колекцій у C#
Наступний:SOS-пост, сподіваюся, Бог допоможе мені, забув пароль від системи входу у школі, як повернути пароль для допомоги? Заздалегідь дякую
Опубліковано 24.11.2014 11:48:29 |
Усунути нульові відновлення
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com