Интерфейсы 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). |
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.