Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 22157|Ответ: 1

[Источник] C# Generic Range Rover (поворот)

[Скопировать ссылку]
Опубликовано 11.11.2014 8: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=Шарп, правда] List<T> ListOfT = новый List<T>(); [/mw_shl_code]
Тип «T» — это тип, который может быть простыми, такими как string, int или пользовательские типы. Давайте рассмотрим конкретный пример.

Класс Персона определяется следующим образом:
[mw_shl_code=csharp,true]класс Человек
{
    частный струнный _name; Название
    рядовой Int _age; Возраст

    Создать объект Person
    публичный человек (имя строки, int возраст)
    {
        this._name= Имя;
        this._age = возраст;
    }

    Название
    Название публичной строки
    {
        get { return _name; }
    }

    Возраст
    публичный международный возраст
    {
        get { return _age; }
    }
}

//创建Person对象
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, который относится к универсальному интерфейсу IComparable<T>. См. код ниже:
[mw_shl_code=csharp,true]класс Person :IComparable<Person>
{
    Сравните по возрасту
    public int CompareTo(Person p)
    {
        Верни это. Возраст — p.Age;
    }
}[/mw_shl_code]
Параметры метода CompareTo — это другой объект того же типа для сравнения, возвращаемое значение — int типа; если возвращаемое значение больше 0, это означает, что первый объект больше второго, если возвращаемое значение меньше 0 — первый объект меньше второго, а если возвращает 0 — оба объекта равны.
После определения стандартных правил сравнения вы можете отсортировать коллекцию с помощью метода сортировки без параметров, следующим образом:
[mw_shl_code=csharp,true]// Отсортировать коллекцию по правилам по умолчанию
личности. Sort();

//输出所有人姓名
foreach (Лицо p в лицах)
{
    Console.WriteLine(p.Name); Порядок выхода: «Ли Сы», «Чжан Сан» и «Ван У»
}[/mw_shl_code]
На практике часто необходимо сортировать коллекцию по различным правилам, что требует определения других правил сравнения, которые можно определить в методе Comparer, который относится к <T>универсальному интерфейсу IComparer, пожалуйста, см. следующий код:
[mw_shl_code=csharp,true]class NameComparer : IComparer<Person>
{
    Экземпляры секвенсоров хранения
    публичный статический NameComparer Default = новый NameComparer();

    Сравните по имени
    публичный int Сравнить (Лицо p1, Person p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Имя, p2. Название);
    }
}[/mw_shl_code]
Параметры метода Compare — это два объекта одного типа для сравнения, а возвращаемое значение имеет тип int, а правила обработки возвратных значений совпадают с правилами метода CompareTo. Comparer.Default возвращает встроенный объект Comparer для сравнения двух объектов одного типа.
    Вот как отсортировать коллекцию с помощью этого нового компаратора:
[mw_shl_code=csharp,true]//Отсортировать коллекцию по названию
личности. Sort(NameComparer.Default);

//输出所有人姓名
foreach (Лицо p в лицах)
{
    Console.WriteLine(p.Name); Порядок выхода: «Ли Сы», «Ван У» и «Чжан Сан».
}[/mw_shl_code]
Вы также можете отсортировать коллекцию, делегировав, прежде всего, определив метод, который делегат должен вызвать для хранения правил сравнения, и использовать статический метод. См. код ниже:
[mw_shl_code=csharp,true]класс PersonComparison
{
    Сравните по имени
    публичное статическое int Имя (Человек p1, Person p2)
    {
        return System.Collections.Comparer.Default.Compare(p1. Имя, p2. Название);
    }
}[/mw_shl_code]
Параметры метода — это два объекта одного типа, которые нужно сравнить, возвращаемое значение имеет тип int, а правило обработки возвратного значения совпадает с правилом метода CompareTo.Затем сортируйте коллекцию через встроенный общий делегат System. <T>Сравнение:
[mw_shl_code=Шарп, правда] <Person> System.Comparison NameComparison = новая System.Comparison<Person>(PersonComparison.Name);
личности. Sort(NameComparison);

//输出所有人姓名
foreach (Лицо p в лицах)
{
    Console.WriteLine(p.Name); Порядок выхода: «Ли Сы», «Ван У» и «Чжан Сан».
}[/mw_shl_code]
Видно, что последние два метода могут сортировать коллекцию по заданным правилам, но автор предпочитает метод делегирования и может рассмотреть возможность размещения различных правил сравнения в классе, а затем гибкого их вызова.
    Поиск универсальных коллекций
    Поиск предназначен для поиска элементов, соответствующих определённым условиям из коллекции, и можно определить и вызвать несколько поисковых условий по мере необходимости. Сначала определите критерии поиска следующим образом:
[mw_shl_code=csharp,true]класс Предикат Личности
{
    Найдите людей среднего возраста (старше 40 лет)
    публичный статический булл MidAge (Лицо p)
    {
        если (с. Возраст >= 40)
            вернитесь на истину;
        Другое
            возврат ложным;
    }
}[/mw_shl_code]
Вышеуказанные критерии поиска размещены в статическом методе с булевым типом возврата, и элементы из коллекции, соответствующие определённым условиям, возвращают истинную или ложную.Затем выполните поиск по коллекции через встроенный общий делегат System.Предикат<T>:
[mw_shl_code=Шарп, правда] System.Предикат<Person> среднего возраста = новый System.Предикат <Person>(PersonПредикат.MidAge);
Список<Person> MidAgePersons = лица. FindAll(Средний возраст предикат);

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

        String val = "";
        foreach (Лицо p в этом)
        {
            val += p.Name + ",";
        }

        Верни Вала. Substring(0, val. Длина — 1);
    }
}

//创建并填充Persons集合
Лица PersonCol = новые Лица();
PersonCol.Add(p1);
PersonCol.Add(p2);
PersonCol.Add(стр. 3);

//输出所有人姓名
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