using System;
using System.Collections.Generic; // Przestrzeń nazw klas ogólnych

namespace Enumerable
{
	public class ListBoxTest : IEnumerable<String>
	{
		private string[] strings;
		private int ctr = 0;
		// Klasy, po których można wyliczać, zwracają licznik
		public IEnumerator<string> GetEnumerator()
		{
			foreach (string s in strings)
			{
				yield return s;
			}
		}

		// Wymagana w celu implementacji interfejsu IEnumerable 
		System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
		{
			throw new NotImplementedException();
		}

		// Inicjowanie listy przy użyciu łańcuchów znaków 
		public ListBoxTest(params string[] initialStrings)
		{
			// Przydzielanie pamięci dla łańcuchów znaków 
			strings = new String[256];

			// Kopiuje łańcuchy znaków przekazane do konstruktora 
			foreach (string s in initialStrings)
			{
				strings[ctr++] = s;
			}
		}

		// Dodaje pojedynczy łańcuch znaków na koniec listy
		public void Add(string theString)
		{
			strings[ctr] = theString;
			ctr++;
		}

		// Umożliwia dostęp taki jak do tablicy 
		public string this[int index]
		{
			get
			{
				if (index < 0 || index >= strings.Length)
				{
					// Obsługa niepoprawnych indeksów
				}
				return strings[index];
			}
			set
			{
				strings[index] = value;
			}
		}

		// Informuje o liczbie przechowywanych łańcuchów znaków 
		public int GetNumEntries()
		{
			return ctr;
		}

	}

	public class Tester
	{
		static void Main()
		{
			// Tworzenie i inicjowanie nowej listy
			ListBoxTest lbt =
			   new ListBoxTest("Witaj", "Świecie");

			// Dodawanie kilku łańcuchów znaków 
			lbt.Add("Proust");
			lbt.Add("Faulkner");
			lbt.Add("Mann");
			lbt.Add("Hugo");

			// Sprawdzanie dostępu
			string subst = "Wszechświecie";
			lbt[1] = subst;

			// Dostęp do wszystkich łańcuchów znaków 
			foreach (string s in lbt)
			{
				if (s == null)
				{
					break;
				}

				Console.WriteLine("Wartość: {0}", s);
			}
		}
	}
}
