/*
A Programmer's Introduction to C# (Second Edition)
by Eric Gunnerson
Publisher: Apress L.P.
ISBN: 1-893115-62-3
*/
// 19 - Indexers and Enumerators\Enumerators and Foreach
// copyright 2000 Eric Gunnerson
using System;
using System.Collections;
// Note: This class is not thread-safe
class IntList: IEnumerable
{
int[] values = new int[10];
int allocated = 10;
int count = 0;
int revision = 0;
public void Add(int value)
{
// reallocate if necessary
if (count + 1 == allocated)
{
int[] newValues = new int[allocated * 2];
for (int index = 0; index < count; index++)
{
newValues[index] = values[index];
}
allocated *= 2;
}
values[count] = value;
count++;
revision++;
}
public int Count
{
get
{
return(count);
}
}
void CheckIndex(int index)
{
if (index >= count)
throw new ArgumentOutOfRangeException("Index value out of range");
}
public int this[int index]
{
get
{
CheckIndex(index);
return(values[index]);
}
set
{
CheckIndex(index);
values[index] = value;
revision++;
}
}
public IEnumerator GetEnumerator()
{
return(new IntListEnumerator(this));
}
internal int Revision
{
get
{
return(revision);
}
}
}
class IntListEnumerator: IEnumerator
{
IntList intList;
int revision;
int index;
internal IntListEnumerator(IntList intList)
{
this.intList = intList;
Reset();
}
public bool MoveNext()
{
index++;
if (index >= intList.Count)
return(false);
else
return(true);
}
public object Current
{
get
{
if (revision != intList.Revision)
throw new InvalidOperationException("Collection modified while enumerating.");
return(intList[index]);
}
}
public void Reset()
{
index = -1;
revision = intList.Revision;
}
}
public class EnumeratorsandForeach {
public static void Main()
{
IntList list = new IntList();
list.Add(1);
list.Add(55);
list.Add(43);
foreach (int value in list)
{
Console.WriteLine("Value = {0}", value);
}
foreach (int value in list)
{
Console.WriteLine("Value = {0}", value);
list.Add(124);
}
}
}