Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Стандартные интерфейсы коллекций






Платформа.NET включает большой набор типов для предоставления стандартных коллекций – списков, множеств, словарей. Эти типы можно разделить на несколько категорий: базовые интерфейсы и вспомогательные классы, классы для коллекций-списков и словарей, набор классов для построения собственных коллекций. Типы сгруппированы в следующие пространства имён:

1. System.Collections – коллекции, в которых элемент коллекции представлен как object (слаботипизированные коллекции).

2. System.Collections.Specialized – специальные коллекции.

3. System.Collections.Generic – универсальные классы и интерфейсы коллекций.

4. System.Collections.ObjectModel – базовые и вспомогательные типы, которые могут применяться для построения пользовательских коллекций.

5. System.Collections.Concurrent – коллекции для использования в многопоточных приложениях.

Рис. 3. Стандартные интерфейсы коллекций.

Опишем набор интерфейсов, реализуемых практически всеми типами коллекций. Основу набора составляют интерфейсы IEnumerable< T> и IEnumerable. Они отражают фундаментальное свойство любой коллекции – возможность перечислить её элементы. Слаботипизированные словари реализуют интерфейс IDictionaryEnumerator для перебора пар «ключ-значение» (DictionaryEntry –вспомогательная структура, у которой определены свойства Key и Value).

public interface IDictionaryEnumerator: IEnumerator

{

DictionaryEntry Entry { get; }

object Key { get; }

object Value { get; }

}

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

public interface ICollection: IEnumerable

{

// метод

void CopyTo(Array array, int index);

 

// свойства

int Count { get; }

bool IsSynchronized { get; }

object SyncRoot { get; }

}

Универсальный интерфейс ICollection< T> также поддерживает свойство для количества элементов. Кроме этого, он предоставляет методы для добавления и удаления элементов, копирования элементов в массив, поиска элемента.

public interface ICollection< T>: IEnumerable< T>

{

// методы

void Add(T item);

void Clear();

bool Contains(T item);

void CopyTo(T[] array, int arrayIndex);

bool Remove(T item);

 

// свойства

int Count { get; }

bool IsReadOnly { get; }

}

Интерфейс IList описывает набор данных, которые проецируются на массив. Дополнительно к функциональности, унаследованной от IEnumerable и ICollection, интерфейс IList позволяет обращаться к элементу по индексу, добавлять, удалять и искать элементы.

public interface IList: ICollection

{

// методы

int Add(object value);

void Clear();

bool Contains(object value);

int IndexOf(object value);

void Insert(int index, object value);

void Remove(object value);

void RemoveAt(int index);

 

// свойства

bool IsFixedSize { get; }

bool IsReadOnly { get; }

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

}

Возможности интерфейса IList< T> тождественны возможностям IList.

public interface IList< T>: ICollection< T>

{

// методы

int IndexOf(T item);

void Insert(int index, T item);

void RemoveAt(int index);

 

// свойство

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

}

В качестве примера работы с интерфейсом IList< T> рассмотрим метод Permutate(), генерирующий все перестановки указанного набора данных.

public static IEnumerable< IList< T> > Permutate< T> (IList< T> sequence,

int count)

{

if (count == 1)

{

yield return sequence;

}

else

{

for (var i = 0; i < count; i++)

{

foreach (var perm in Permutate(sequence, count - 1))

{

yield return perm;

}

 

// циклический сдвиг sequence

T last = sequence[count - 1];

sequence.RemoveAt(count - 1);

sequence.Insert(0, last);

}

}

}

Интерфейсы IDictionary и IDictionary< TKey, TValue> определяют протокол взаимодействия для коллекций-словарей (KeyValuePair< TKey, TValue> – это вспомогательная структура, у которой определены свойства Key и Value).

public interface IDictionary: ICollection

{

// методы

void Add(object key, object value);

void Clear();

bool Contains(object key);

IDictionaryEnumerator GetEnumerator();

void Remove(object key);

 

// свойства

bool IsFixedSize { get; }

bool IsReadOnly { get; }

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

ICollection Keys { get; } // все ключи словаря

ICollection Values { get; } // все значения словаря

}

 

public interface IDictionary< TKey, TValue>:

ICollection< KeyValuePair< TKey, TValue> >

{

// методы

void Add(TKey key, TValue value);

bool ContainsKey(TKey key);

bool Remove(TKey key);

bool TryGetValue(TKey key, out TValue value);

 

// свойства

TValue this[TKey key] { get; set; }

ICollection< TKey> Keys { get; }

ICollection< TValue> Values { get; }

}

Для работы с коллекциями-множествами предназначен интерфейс ISet< T>. Его набор методов отражает типичные операции для множеств.

public interface ISet< T>: ICollection< T>

{

bool Add(T item);

void ExceptWith(IEnumerable< T> other);

void IntersectWith(IEnumerable< T> other);

bool IsProperSubsetOf(IEnumerable< T> other);

bool IsProperSupersetOf(IEnumerable< T> other);

bool IsSubsetOf(IEnumerable< T> other);

bool IsSupersetOf(IEnumerable< T> other);

bool Overlaps(IEnumerable< T> other);

bool SetEquals(IEnumerable< T> other);

void SymmetricExceptWith(IEnumerable< T> other);

void UnionWith(IEnumerable< T> other);

}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.