Курс лекций для студентов специальности i-31 03 04 Информатика всех форм обучения Минск 2010



страница7/29
Дата09.08.2019
Размер0.64 Mb.
#126834
ТипКурс лекций
1   2   3   4   5   6   7   8   9   10   ...   29

2.8. ИНТЕРФЕЙСЫ СТАНДАРТНЫХ КОЛЛЕКЦИЙ


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

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

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

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

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

Опишем набор интерфейсов, реализуемых практически всеми типами коллекций. Основу набора составляют интерфейсы IEnumerable и 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 также поддерживает свойство для количества элементов. Кроме этого, он предоставляет методы для добавления и удаления элементов, копирования элементов в массив, поиска элемента.



public interface ICollection : IEnumerable

{

// методы



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 тождественны возможностям IList.



public interface IList : ICollection

{

// методы



int IndexOf(T item);

void Insert(int index, T item);

void RemoveAt(int index);
// свойство

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

}

Интерфейсы IDictionary и IDictionary определяют протокол взаимодействия для коллекций-словарей (KeyValuePair  это вспомогательная структура, у которой определены свойства 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 :

ICollection>

{

// методы



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 Keys { get; }

ICollection Values { get; }

}

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



public interface ISet : ICollection

{

bool Add(T item);



void ExceptWith(IEnumerable other);

void IntersectWith(IEnumerable other);

bool IsProperSubsetOf(IEnumerable other);

bool IsProperSupersetOf(IEnumerable other);

bool IsSubsetOf(IEnumerable other);

bool IsSupersetOf(IEnumerable other);

bool Overlaps(IEnumerable other);

bool SetEquals(IEnumerable other);

void SymmetricExceptWith(IEnumerable other);

void UnionWith(IEnumerable other);

}

2.9. МАССИВЫ И КЛАСС SYSTEM.ARRAY


Класс System.Array является базовым классом для любого массива. Язык C# поддерживает особый синтаксис объявления и инициализации массивов, но CLR на основе этого синтаксиса порождает класс, унаследованный от Array.

Любой массив реализует интерфейсы IList и IList, причём IList реализован явно (так как методы Add() и Remove() генерируют исключение в случае коллекции фиксированной длины, которой является массив). В табл. 6 описаны экземплярные элементы любого массива, а табл. 7 содержит статические методы класса Array.

Таблица 6

Экземплярные элементы массива



Имя элемента

Описание

Rank

Свойство для чтения, возвращает размерность массива

Length

Свойство для чтения, возвращает общее число элементов массива

LongLength

Свойство для чтения  число элементов. Имеет тип long

CopyTo()

Метод копирует фрагмент массива в другой массив

GetLength()

Метод возвращает число элементов в указанном измерении

GetLowerBound()

Метод возвращает нижнюю границу для указанного измерения

GetUpperBound()

Метод возвращает верхнюю границу для указанного измерения

GetValue()

Метод возвращает значение элемента с указанными индексами

SetValue()

Метод устанавливает значение элемента с указанными индексами

Таблица 7

Статические элементы класса System.Array



Имя метода

Описание

Sort()

Сортирует массив, переданный в качестве параметра (возможно, с применением собственного объекта для сравнения элементов)

BinarySearch()

Поиска элемента в отсортированном массиве

IndexOf()

Возвращает индекс первого вхождения своего аргумента в одномерный массив (фрагмент массива) или –1, если элемента в массиве нет

LastIndexOf()

Возвращает индекс последнего вхождения аргумента в одномерный массив (фрагмент массива) или –1, если элемента в массиве нет

Exists()

Определяет, содержит ли массив хотя бы один элемент, удовлетворяющий предикату, который задан параметром метода

Find()

Возвращает первый элемент, удовлетворяющий предикату, который задан параметром метода

FindLast()

Возвращает первый элемент с конца массива, удовлетворяющий предикату, который задан параметром метода

FindAll()

Возвращает все элементы, удовлетворяющие предикату, который задан параметром метода

FindIndex()

Возвращает индекс первого вхождения элемента, удовлетворяющего предикату, заданному как параметр метода

FindLastIndex()

Возвращает индекс последнего вхождения элемента, удовлетворяющего предикату, заданному как параметр метода

ConvertAll()

Конвертирует массив одного типа в массив другого типа

ForEach()

Выполняет указанное действие для всех элементов массива

TrueForAll()

Возвращает true, если заданный предикат верен для всех элементов

Clear()

Устанавливает для массива или его части значение по умолчанию для типа элементов

Reverse()

Меняет порядок элементов в одномерном массиве или его части на противоположный

AsReadOnly()

Создает на основе массива коллекцию, не допускающую модификации своих элементов (read-only collection)

CreateInstance()

Создает экземпляр массива любого типа, размерности и длины

Copy()

Копирует раздел одного массива в другой массив, выполняя приведение типов

ConstrainedCopy()

Метод подобен Copy(), но если приведение типов для элементов неудачно, выполняется отмена операции копирования

Resize()

Позволяет изменить размер массива

Рассмотрим несколько примеров использования методов массива. В первом примере создадим массив и выполним работу с его элементами, не применяя традиционный синтаксис C#.

Array a = Array.CreateInstance(typeof(string), 2); // тип, длина

a.SetValue("hi", 0); // a[0] = "hi";

a.SetValue("there", 1); // a[1] = "there";

string s = (string)a.GetValue(0); // s = a[0];

Метод CreateInstance() может создать массив любой размерности с указанным диапазоном изменения индексов:

// b – это массив int[-5..4, 100..119]

Array b = Array.CreateInstance(typeof(int),

new[] {10, 20}, new[] {-5, 100});

b.SetValue(25, -3, 110);

int x = (int) b.GetValue(-2, 115);

Группа статических методов класса Array позволяет выполнить сортировку и поиск данных в массиве. Методы поиска могут использовать заданные предикаты, а сортировка – выполняться по заданному критерию сравнения.

int[] a = {10, 3, 5, -7, 0, 20, 10, 4}; // исходный массив

int b = Array.Find(a, x => x > 6); // поиск элемента по предикату

int[] c = Array.FindAll(a, x => x > 6); // поиск всех элементов

Array.ForEach(c, Console.WriteLine); // действие над элементами

bool flag = Array.TrueForAll(a, x => x > 0); // проверка условия

Array.Sort(a, (x, y) => x == y ? 0 : x > y ? -1 : 1); // сортировка

int pos = Array.BinarySearch(a, 3); // двоичный поиск

Массивы допускают копирование элементов и изменение размера:

int[] a = {10, 3, 5, -7, 0, 20, 10, 4};

int[] b = new int[a.Length];

long[] c = new long[a.Length];

a.CopyTo(b, 0);

Array.Copy(a, c, a.Length);

Array.Resize(ref a, 40);

Заметим, что для быстрого копирования массивов с элементами типа значений можно использовать класс System.Buffer, который оперирует байтами данных.

int[] a = {10, 3, 5, -7, 0, 20, 10, 4};

int[] b = new int[a.Length];

Buffer.BlockCopy(a, 3, b, 5, 10); // смещение задано в байтах!



Каталог: images
images -> В списке студентов (или магистрантов)
images -> Н. И. Сулейманов Комплект контрольно-оценочных средств для оценки результатов освоения профессионального модуля разработан на основе Федерального государственного образовательного стандарта среднего профессионального
images -> По направлению подготовки
images -> Добавить гаджеты. Добавление гаджетов
images -> Техническое задание № apnip/C. 2/CS/Ind/01 Международный консультант по улучшенной производительности орошаемого земледелия
images -> Комплект контрольно-оценочных средств по профессиональному модулю пм. 01 Техническое обслуживание и ремонт автотранспорта


Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7   8   9   10   ...   29




База данных защищена авторским правом ©vossta.ru 2022
обратиться к администрации

    Главная страница