Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Основные классы коллекций объектов



В С# коллекция представляет собой совокупность объектов. В среде.NET Framework имеется немало интерфейсов и классов, в которых определяются и реализуются различные типы коллекций. Коллекции упрощают решение многих задач программирования благодаря тому, что предлагают готовые решения для создания целого ряда типичных, но порой трудоемких для разработки структур данных. Например, в среду.NET Framework встроены коллекции, предназначенные для поддержки динамических массивов, связных списков, стеков, очередей и хеш-таблиц.

Главное преимущество коллекций заключается в том, что они стандартизируют обработку групп объектов в программе. Все коллекции разработаны на основе набора четко определенных интерфейсов.

В среде.NET Framework поддерживаются пять типов коллекций:

а) необобщенные;

б) специальные;

в) с поразрядной организацией;

г) обобщенные;

д) параллельные.

Необобщенные коллекции реализуют ряд основных структур данных, включая динамический массив, стек, очередь, а также словари, в которых можно хранить пары " ключ-значение". В отношении необобщенных коллекций важно иметь в виду следующее: они оперируют данными типа object. Таким образом, необобщенные коллекции могут служить для хранения данных любого типа, причем в одной коллекции допускается наличие разнотипных данных. Очевидно, что такие коллекции не типизированы, поскольку в них хранятся ссылки на данные типа object. Классы и интерфейсы необобщенных коллекций находятся в пространстве имен System.Collections.

Специальные коллекции оперируют данными конкретного типа или же делают это каким-то особым образом. Например, имеются специальные коллекции для символьных строк, а также специальные коллекции, в которых используется однонаправленный список. Специальные коллекции объявляются в пространстве имен System.Collections.Specialized.

В прикладном интерфейсе Collections API определена одна коллекция с поразрядной организацией — это BitArray. Коллекция типа BitArray поддерживает поразрядные операции, т.е. операции над отдельными двоичными разрядами, например И или исключающее ИЛИ, а следовательно, она существенно отличается своими возможностями от остальных типов коллекций. Коллекция типа BitArray объявляется в пространстве имен System. Collections.

Обобщенные коллекции обеспечивают обобщенную реализацию нескольких стандартных структур данных, включая связные списки, стеки, очереди и словари. Такие коллекции являются типизированными в силу их обобщенного характера. Это означает, что в обобщенной коллекции могут храниться только такие элементы данных, которые совместимы по типу с данной коллекцией. Благодаря этому исключается случайное несовпадение типов. Обобщенные коллекции объявляются в пространстве имен System.Collections.Generic.

Параллельные коллекции поддерживают многопоточный доступ к коллекции. Это обобщенные коллекции, определенные в пространстве имен System.Collections.Concurrent.

В пространстве имен System.Collections.ObjectModel находится также ряд классов, поддерживающих создание пользователями собственных обобщенных коллекций.

Основополагающим для всех коллекций является понятие перечислителя, который поддерживается в необобщенных интерфейсах IEnumerator и IEnumerable, а также в обобщенных интерфейсах IEnumerator< T> и IEnumerable< T>. Перечислитель обеспечивает стандартный способ поочередного доступа к элементам коллекции. Следовательно, он перечисляет содержимое коллекции. В каждой коллекции должна быть реализована обобщенная или необобщенная форма интерфейса IEnumerable, поэтому элементы любого класса коллекции должны быть доступны посредством методов, определенных в интерфейсе IEnumerator или IEnumerator< T>. Это означает, что, внеся минимальные изменения в код циклического обращения к коллекции одного типа, его можно использовать для аналогичного обращения к коллекции другого типа.

С перечислителем непосредственно связано другое средство, называемое итератором. Это средство упрощает процесс создания классов коллекций, например, специальных, поочередное обращение к которым организуется в цикле for each.

 

Интерфейсы необобщенных коллекций

 

В пространстве имен System.Collections определен целый ряд интерфейсов необобщенных коллекций. Начинать рассмотрение необобщенных коллекций следует именно с интерфейсов, поскольку они определяют функциональные возможности, которые являются общими для всех классов необобщенных коллекций. Интерфейсы, служащие опорой для необобщенных коллекций, сведены в табл. 5.

 

 

Таблица 5

Интерфейсы необобщенных коллекций

Интерфейс Описание
iCollection Определяет элементы, которые должны иметь все необобщенные коллекции
iComparer Определяет метод Compare () для сравнения объектов, хранящихся в коллекции
iDictionary   Определяет коллекцию, состоящую из пар " ключ-значение"
IDictionaryEnumerator Определяет перечислитель для коллекции, реализующей интерфейс IDictionary
IEnumerable Определяет метод GetEnumerator(), предоставляющий перечислитель для любого класса коллекции
IEnumerator Предоставляет методы, позволяющие получать содержимое коллекции по очереди
iEqualityComparer Сравнивает два объекта на предмет равенства
iList Определяет коллекцию, доступ к которой можно получить с помощью индексатора
iStructuralComparable Определяет метод CompareTo (), применяемый для структурного сравнения
iStructuralEquatable Определяет метод Equals(), применяемый для выяснения структурного, а не ссылочного равенства. Кроме того, определяет метод GetHashCode ()

 

Далее будут рассмотрены интерфейсы ICollection и IDictionary.

 

 

Интерфейс ICollection

 

Интерфейс ICollection служит основанием, на котором построены все необобщенные коллекции. В нем объявляются основные методы и свойства для всех необобщенных коллекций. Он также наследует от интерфейса IEnumerable.

В интерфейсе ICollection определяются перечисленные ниже свойства. Свойство Count используется чаще всего, поскольку оно содержит количество элементов, хранящихся в коллекции на данный момент. Если значение свойства Count равно нулю, то коллекция считается пустой.

В интерфейсе ICollection определяется следующий метод.

void CopyTo(Array target, int startIdx)

Метод СоруТо() копирует содержимое коллекции в массив target, начиная с элемента, указываемого по индексу startIdx. Следовательно, метод СоруТо() обеспечивает в С# переход от коллекции к стандартному массиву.

Благодаря тому что интерфейс ICollection наследует от интерфейса IEnumerable, в его состав входит также единственный метод, определенный в интерфейсе IEnumerable. Это метод GetEnumerator (), объявляемый следующим образом.

IEnumerator GetEnumerator()

Он возвращает перечислитель для коллекции.

 

Интерфейс IList

 

В интерфейсе IList объявляется такое поведение необобщенной коллекции, которое позволяет осуществлять доступ к ее элементам по индексу с отсчетом от нуля.

Этот интерфейс наследует от интерфейсов ICollection и IEnumerable. Помимо методов, определенных в этих интерфейсах, в интерфейсе IList определяется ряд собственных методов. В некоторых из них предусматривается модификация коллекции. Если же коллекция доступна только для чтения или имеет фиксированный размер, то в этих методах генерируется исключение NotSupportedException.

Методы, определенные в IList:

1) int Add(object value) - добавляет объект value в вызывающую коллекцию. Возвращает индекс, по которому этот объект сохраняется.

2) void Clear() - удаляет все элементы из вызывающей коллекции

3) bool Contains(object value) - возвращает логическое значение true, если вызывающая коллекция содержит объект value, а иначе — логическое значение false.

4) int indexOf(object value) - возвращает индекс объекта value, если этот объект содержится в вызывающей коллекции. Если же объект value не обнаружен, то метод возвращает значение -1.

5) void Insert(int index, object value) - вставляет в вызывающую коллекцию объект value по индексу index. Элементы, находившиеся до этого по индексу index и дальше, смещаются вперед, чтобы освободить место для вставляемого объекта value;

6) void Remove(object value) - удаляет первое вхождение объекта value в вызывающей коллекции. Элементы, находившиеся до этого за удаленным элементом, смещаются назад, чтобы устранить образовавшийся " пробел";

7) void RemoveAt(int index) - удаляет из вызывающей коллекции объект, расположенный по указанному индексу index. Элементы, находившиеся до этого за удаленным элементом, смещаются назад, чтобы устранить образовавшийся " пробел".

Объекты добавляются в коллекцию типа iList вызовом метода Add(), который принимает аргумент типа object. А поскольку object является базовым классом для всех типов, то в необобщенной коллекции может быть сохранен объект любого типа, включая и типы значений.

В интерфейсе IList определяются следующие свойства.

bool IsFixedSize { get; }

bool IsReadOnly { get; }

Если коллекция имеет фиксированный размер, то свойство IsFixedSize содержит логическое значение true. Это означает, что в такую коллекцию нельзя ни вставлять элементы, ни удалять их из нее. Если же коллекция доступна только для чтения, то свойство IsReadOnly содержит логическое значение true. Это означает, что содержимое такой коллекции не подлежит изменению.

Кроме того, в интерфейсе IList определяется следующий индексатор.

object this[int index] { get; set; }

Этот индексатор служит для получения и установки значения элемента коллекции. Но его нельзя использовать для добавления в коллекцию нового элемента. С этой целью обычно вызывается метод Add (). Как только элемент будет добавлен в коллекцию, он станет доступным посредством индексатора.

Пример:

using System;

using System.Collections;

using System.Collections.Generic;

using System.Collections.ObjectModel;

using System.Text;

 

public class MainClass

{

 

public static void Main()

{

IList< double> myList = new List< double> ();

 

myList.Add(10.5);

myList.Add(209.224);

myList.Insert(1, 3.999);

myList.Add(48.2);

myList.Remove(10.4);

Console.WriteLine(" IndexOf {0} = {1}", 209.2234,

myList.IndexOf(209.2234));

Console.WriteLine(" IndexOf {0} = {1}", 10.54, myList.IndexOf(10.54));

 

}

}

 

Интерфейс IDictionary

 

В интерфейсе IDictionary определяется такое поведение необобщенной коллекции, которое позволяет преобразовать уникальные ключи в соответствующие значения. Ключ представляет собой объект, с помощью которого значение извлекается впоследствии. Следовательно, в коллекции, реализующей интерфейс IDictionary, хранятся пары " ключ-значение". Как только подобная пара будет сохранена, ее можно извлечь с помощью ключа. Интерфейс IDictionary наследует от интерфейсов ICollection и IEnumerable. Некоторые из методов, объявленных в IDictionary, генерируют исключение ArgumentNullException при попытке указать пустой ключ, поскольку пустые ключи не допускаются.

Методы, определенные в IDictionary:

1) void Add(object key, object value) - добавляет в вызывающую коллекцию пару " ключ-значение", определяемую параметрами key и value.

2) void Clear() - удаляет все пары " ключ-значение" из вызывающей коллекции.

3) bool Contains(object key) - возвращает логическое значение true, если вызывающая коллекция содержит объект key в качестве ключа, в противном случае — логическое значение false.

4) iDictionaryEnumerator GetEnumerator() - возвращает перечислитель для вызывающей коллекции.

5) void Remove (object key) - удаляет из коллекции элемент, ключ которого равен значению параметра key.

Свойства, определенные в IDictionary:

1) bool isFixedSize { get; } - принимает логическое значение true, если словарь имеет фиксированный размер;

2) bool isReadOnly{ get; } - принимает логическое значение true, если словарь доступен только для чтения;

3) ICollection Keys { get; } - получает коллекцию ключей;

4) ICollection Values { get; } - получает коллекцию значений.

Кроме того, в интерфейсе IDictionary определяется следующий индексатор.

object this[object key] { get; set; }

Этот индексатор служит для получения и установки значения элемента коллекции, а также для добавления в коллекцию нового элемента. Но в качестве индекса в данном случае служит ключ элемента, а не собственно индекс.

Пример:

using System;

using System.Collections;

using System.Collections.Generic;

using System.Collections.ObjectModel;

using System.Text;

 

public class MainClass

{

public static void Main()

{

IDictionary< string, float> salaryMap = new

Dictionary< string, float> ();

 

salaryMap.Add(" S", 60.5);

salaryMap.Add(" W", 10.0);

salaryMap.Add(" J", 30.99);

 

Console.WriteLine(salaryMap.ContainsKey(" S" ));

Console.WriteLine(salaryMap.ContainsKey(" T" ));

}

}


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-07-14; Просмотров: 758; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.038 с.)
Главная | Случайная страница | Обратная связь