Читайте также: |
|
Прежде чем рассмотреть внимательно использование классов коллекций, мы приведем обзор доступных обобщенных классов и интерфейсов коллекций.
Основные интерфейсы и их функциональность представлены в табл. 7.1.
Таблица 7.1. Основные интерфейсы и функциональность обобщенных коллекций
Интерфейс | Методы и свойства | Описание |
ICollection<T> | Add() Clear() Contains() CopyTo() Remove() Count IsReadOnly | Интерфейс ICollection<T> реализован классами коллекций. Методы этого интерфейса могут быть использованы для добавления и удаления элементов коллекции. Обобщенный интерфейс ICollection<T> наследуется от необобщенного интерфейса IEnumerable. Поэтому можно передавать объекты, реализующие ICollection<T>, методам, которые требуют параметры IEnumerable. |
IList<T> | Insert() RemoveAt() IndexOf () Item | Интерфейс List<T> позволяет организовать доступ к элементам коллекции с помощью индексатора. Он также позволяет вставлять и удалять элементы в любой позиции. Подобно ICollection, IList<T> наследуется от IEnumerable. |
IEnumerable<T> | GetEnumerator() | Интерфейс IEnumerable<T> требуется для использования оператора foreach с коллекцией. Этот интерфейс определяет метод GetEnumerator(), который возвращает перечислитель, реализующий IEnumerator<T>. Обобщенный интерфейс IEnumerable <T> наследуется от необобщенного IEnumerable. |
IEnumerator<T> | Current | Оператор fоreach использует перечислитель, реализующий IEnumerator<T> Для доступа ко всем элементам коллекции. Интерфейс IEnumerable<T> наследуется от необобщенных интерфейсов IEnumerator и IDisposable. Интерфейс IEnumerator определяет методы MoveNext() и Reset(). IEnumerable<T> определяет безопасную к типам версию свойства current. |
IDictionary<TKey, TValue> | Add () ContainsKey() Remove() TryGetValue () Item, Keys, Values | Интерфейс IDictionary<K,V> реализуется коллекциями, элементы которых имеют ключ и значение. |
IComparer<T> | Compare () | Интерфейс IComparer<T> применяется для сортировки элементов внутри коллекции методом Compare(). |
IEqualityComparer<T> | Equals () GetHashCode () | IEqualityComparer<T> — второй интерфейс для сравнения объектов. С этим интерфейсом объекты могут быть проверены на равенство. Метод GetHashCode() должен возвращать уникальное значение для каждого объекта. Метод Equals() возвращает true, если объекты равны, и false — в противном случае. |
Обобщенные классы коллекций и их функциональность представлены в табл. 7.2.
Таблица 7.2. Обобщенные классы коллекций и их функциональность
Класс | Реализованные интерфейсы | Описание |
List<T> | IList<T> ICollection<T> IEnumerable<T> | Класс List<T> — обобщенная замена класса ArrayList. Подобно ArrayList, List<T> может расти и уменьшаться динамически. Помимо реализации трех указанных интерфейсов, он также поддерживает дополнительную функциональность, такую как сортировку и смена порядка следования элементов на обратный. |
Dictionary <ТКеу, TValue> | IDictionary<TKey, TValue> ICollection<KeyValue Pair <TKey, TValue>> IEnumerable<KeyValuePair <TKey, TValue>> ISerializable IDeserializationCallback | Dictionary<TKey, TValue> — класс коллекций, которые хранят пары ключ-значение. |
SortedList<ТКеу, TValue> | IDictionary<TKey, TValue>, ICollection<Ke у Value Pair <TKey, TValue>> IEnumerable<KeyValuePair <TKey, TValue» | SortedList<TKey, TValue> подобен Dictionary<TKey, TValue> с тем отличием, что эта коллекция сортируется по ключу. |
LinkedList<T> | ICollection<T> IEnumerableISerializable IDeserializationCallback | LinkedList<T> — двунаправленный связный список. Каждый элемент имеет ссылки на предыдущий и следующий элементы. |
Queue<T> | ICollection<T> IEnumerable<T> | Queue<T> — коллекция, поддерживающая алгоритм «первым пришел — первым обслужен». Элемент, добавленный первым, первым и будет прочитан. Метод Enque() добавляет объект в конец очереди; метод Deque() возвращает и удаляет объект из начала очереди. Методом Peek() можно прочитать первый объект очереди, не удаляя его. |
Stack<T> | ICollection<T> IEnumerable<T> | Stack<T> — коллекция, реализующая алгоритм «последним пришел — первым обслужен». Элемент, добавленный последним, будет прочитан из стека первым. Stack<T> предлагает методы Push() и Pop(). Push() добавляет элемент в конец стека, a Pop() читает и удаляет объект из конца стека. Метод Peek() позволяет прочитать последний элемент стека, не удаляя его. |
Среда. NET Framework представляет некоторые базовые классы обобщенных коллций, которые могут быть использованы для создания пользовательских обобщенных классов. Классы, представленные в табл. 7.3, находятся в пространстве имен System.Collections.ObjectModel.
Таблица 7.3. Классы из пространства имен System.Collections.ObjectModel
Класс | Реализованные интерфейсы | Описание |
Collection<T> | IList<T> ICollection<T> IEnumerable<T> | Класс Collection<T> может быть использован в качестве базового для пользовательских обобщенных классов коллекций. Реализует интерфейсы IList<T>, IColleetion<T> и IEnumerable<T>. Внутри этот класс использует класс List<T>, однако не предоставляет доступ ко всем методам List<T>. Поэтому в пользовательских обобщенных классах коллекций вы можете представить методы, необходимые для конкретного применения. В пользовательских классах можно получить доступ к лежащему в основе объекту List<T> через защищенное свойство Items. |
ReadOnlyCollection<T> | IList<T> ICollection<T> IEnumerable<T> | ReadOnlyCollection<T> — версия класса Collection<T> с доступом только для чтения. Все методы интерфейсов, которые позволяют добавление и удаление элементов, реализованы явно и генерируют исключение NotSupportedException. Объект этого класса может быть создан передачей конструктору любой коллекции, реализующей IList<T>. |
KeyedCol lection<TKey, TItem> | IList<TItem> ICollection<TItem> IEnumerable<TItem> | KeyedCollectior<TKey, TItem> — абстрактный базовый класс, который можно использовать для создания пользовательских классов коллекций, имеющих ключ и значения. Класс наследуется от Collection<TItem> |
Использование класса List<T>
Класс List<T> из пространства имен System.Collections.Generic очень похож в применении на ArrayList из пространства имен System.Collections. Этот класс реализует интерфейсы IList, ICollection и IEnumerable.
В следующем примере используется класс Student в качестве типа элементов, добавляемых к коллекции, хранящей информацию о студентах факультета Информатизации и управления РГЭУ. Этот класс имеет два поля — полное имя студента и номер групы, доступ к которым организован через свойства. Значения полей передаются экземпляру класса в параметрах конструктора. Метод ToString() переопределен так, чтобы возвращать имя студента и номер групы:
class Student
{
private string fullName;
private string group;
public string FullName {
get { return fullName; }
set { fullName = value; } }
public string Group {
get { return group; }
set { group = value; } }
public Student(string fullName, string group)
{
this.fullName = fullName;
this.group = group;
}
public override string ToString()
{
return fullName + " группа " + group;
}
Переменная students определена как имеющая тип List<Student>. Операцией new создается объект того же типа. Здесь используется конструктор класса List<T> поумолчанию. Но у него также есть конструктор, резервирующий память для определеного числа элементов, а также конструктор, копирующий элементы из другой коллекции типа List<T>.
Поскольку экземпляр класса List<T> создается с конкретным классом Student в качестве параметра, только объекты типа Student могут быть добавлены в коллекцию методом Add(). В классе List<T> метод Add() определен как Add(Tltem). В следующем примере создаются и добавляются в коллекцию шесть студентов. Затем с помощью оператора foreach выполняется итерация по коллекции и каждый
class Program
{
static void Main(string[] args)
{
List<Student> students = new List<Student>();
students.Add(new Student ("Акинина Ольга","331"));
students.Add(new Student ("Викулов Михаил","331"));
students.Add(new Student ("Анисимова Наталья", "321"));
students.Add(new Student ("Квасов Виктор", "321"));
students.Add(new Student ("Илларионов Евнений", "334"));
students.Add(new Student("Кузнецова Татьяна", "334"));
foreach (Student st in students)
Console.WriteLine(st);
string s = Console.ReadLine();
}
}
На рис.7.1 приведен результат работы программы.
Рис. 7.1. Вывод данных коллекции
Используя класс List<T>, можно не только добавлять элементы и обращаться к ним через перечислитель; этот класс также имеет методы для вставки и удаления элементов, очистки коллекции и копирования элементов в массив. Ниже описана еще более мощная функциональность. List<T> представляет методы для поиска и преобразования элементов, для изменения их порядка на противоположный и тому подобных действий.
Дата добавления: 2015-07-07; просмотров: 180 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Повторное использование двоичного кода | | | Поиск элементов |