//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
//
using System;
using System.Collections;

namespace Testing
{
	// Deklaracja zbioru:
	public class CSharpCollection 
	{
		int[] items;

		public CSharpCollection() 
		{
			items = new int[5] {1, 2, 3, 4, 5};
		}

		public CSharpEnumerator GetEnumerator() 
		{
			return new CSharpEnumerator(this);
		}

		// Deklaracja klasy enumeratora:
		public class CSharpEnumerator 
		{
			int nIndex;
			CSharpCollection collection;
			public CSharpEnumerator(CSharpCollection coll) 
			{
				collection = coll;
				nIndex = -1;
			}

			public bool MoveNext() 
			{
				nIndex++;
				return(nIndex < collection.items.GetLength(0));
			}

			public int Current 
			{
				get 
				{
					return(collection.items[nIndex]);
				}
			}
		}
	}

	public class GenericCollection: IEnumerable 
	{
		int[] items;
		public GenericCollection() 
		{
			items = new int[5] {6, 7, 8, 9, 10};
		}

		public GenericEnumerator GetEnumerator() 
		{
			return new GenericEnumerator(this);
		}

		// Implementacja metody GetEnumerator():
		IEnumerator IEnumerable.GetEnumerator() 
		{
			return GetEnumerator();
		}

		// Deklaracja enumeratora i implementacja interfejsu IEnumerator:
		public class GenericEnumerator: IEnumerator 
		{
			int nIndex;
			GenericCollection collection;
			public GenericEnumerator(GenericCollection coll) 
			{
				collection = coll;
				nIndex = -1;
			}

			public void Reset() 
			{
				nIndex = -1;
			}

			public bool MoveNext() 
			{
				nIndex++;
				return(nIndex < collection.items.GetLength(0));
			}

			public int Current 
			{
				get 
				{
					return(collection.items[nIndex]);
				}
			}

			// Bieżąca właściwość interfejsu IEnumerator:
			object IEnumerator.Current 
			{
				get 
				{
					return(Current);
				}
			}
		}
	}

	class ForeachMain
	{
		static void Main(string[] args)
		{
			string [] sa = new string [] { "To", "jest", "test" };
			foreach(string s in sa)
			{
				Console.WriteLine(s);
			}
			CSharpCollection cscol = new CSharpCollection();
			Console.WriteLine("Wartości w zbiorze C# to:");
			foreach (int i in cscol) 
			{
				Console.WriteLine(i);
			}
			GenericCollection gencol = new GenericCollection();
			Console.WriteLine("Wartości w ogólnym zbiorze to:");
			foreach (int i in gencol) 
			{
				Console.WriteLine(i);
			}
		}
	}
}
