Интерфейсы IEnumerable, IEnumerator и IDictionaryEnumerator

  • docx
  • 18.11.2021
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала Л2-002167.docx

Интерфейсы IEnumerable, IEnumerator и IDictionaryEnumerator Основополагающим для всех коллекций является реализация пере- числителя    (нумератора),    который    поддерживается    интерфейсами

IEnumerator и IEnumerable.

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

 

Следовательно, после внесения небольших изменений код, который позволяет циклически опрашивать коллекцию одного типа, можно ус- пешно использовать для циклического опроса коллекции другого типа (например в цикле foreach).

Все коллекции C# реализуют перечислитель. interface IEnumerable

{

IEnumerator GetEnumerator(

}

interface IEnumerator

{

object Current { get }; bool    MoveNext(); void         Reset();

}


Метод GetEnumerator возвращает объект-перечислитель для коллек- ции.

 

Исключение. Для коллекций, в которых хранятся пары ключ/значение (т.е. словари), метод GetEnumerator() возвращает объект типа IDictionaryEnumerator, а не типа IEnumerator.

Класс IDictionaryEnumerator является производным от класса IEnumerator и распространяет свои функциональные возможности пере- числителя на область словарей.

 

Почему перечислитель является объектом?

Ответ: у одной коллекции может быть несколько перечислителей.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Перечислитель 2

 

 

Перечислитель

1:

 

Current

 

MoveNext

)

Reset()

 

 

 

 

 

рис.1

 

Пример. На основе структуры Vector создать коллекцию. Коллекция должна перечислять трехмерные координаты вектора (X, Y, Z).

 

using System;

using System.Collections; using System.Text;

 

class MainEntryPoint

{

static void Main(string[] args)

{

Vector Vect1 = new Vector(1.0, 2.0, 5.0); foreach (double Next in Vect1)

Console.Write(" " + Next); Console.ReadLine();

}

}

 

struct Vector : IEnumerable


{

private double x, y, z;

 

public Vector(double x, double y, double z)

{

this.x = x; this.y = y; this.z = z;

}

 

public IEnumerator GetEnumerator()

{

return new VectorEnumerator(this);

}

 

private class VectorEnumerator : IEnumerator

{

Vector theVector; int            location;

 

public VectorEnumerator(Vector Vect)

{

theVector = Vect; location = -1;

}

 

public bool MoveNext()

{

++location;

return (location > 2) ? false : true;

}

 

public object Current

{

get

{

switch (location)

{

case 0:

return theVector.x; case 1:

return theVector.y; case 2:

return theVector.z; default:

throw new IndexOutOfRangeException(

"Вышли за границу вектора: " + location);

}

}

}

public void Reset()

{

location = -1;

}

}

}


Интерфейс ICollection

Интерфейс ICollection является фундаментом, на котором построены все коллекции. Он наследует интерфейс IEnumerable.

 


рис.2

 

В интерфейсе ICollection определены следующие свойства:

Свойство

Описание

int Count { get; }

Количество элементов коллекции в дан- ный момент

 

bool IsSynchronized

{ get; }

Принимает значение true, если коллек- ция синхронизирована, и значение false в противном случае. По умолчанию коллек- ции не синхронизированы. Но для большин- ства коллекций можно получить синхрони- зированную версию

object SyncRoot

{ get; }

Объект, для которого коллекция может быть синхронизирована

 

Методы интерфейса ICollection:

Метод

Описание

void CopyTo (

Array   tar-

get,

int     star-

tIdx);

Метод копирует содержимое коллекции в массив target, начиная с индекса startIdx.

 

IEnumerator

GetEnumerator();

Метод возвращает перечислитель кол- лекции (задан интерфейсом IEnumerable).