using System;

namespace OverloadedIndexer
{
	// Uproszczona kontrolka typu ListBox
	public class ListBoxTest
	{
		private string[] strings;
		private int ctr = 0;

		// 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];

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

		// Dodaje pojedynczy łańcuch znaków na koniec listy
		public void Add(string theString)
		{
			if (ctr >= strings.Length)
			{
				// Obsługa niepoprawnych indeksów
			}
			else
			{
				strings[ctr++] = theString;
			}
		}


		// Umożliwia dostęp jak do tablicy 
		public string this[int index]
		{
			get
			{
				if (index < 0 || index >= strings.Length)
				{
					// Obsługa niepoprawnych indeksów
				}
				return strings[index];
			}
			set
			{
				// Elementy można dodawać jedynie przy użyciu metody add
				if (index >= ctr)
				{
					// Obsługa błędów
				}
				else
					strings[index] = value;
			}
		}

		private int FindString(string searchString)
		{
			for (int i = 0; i < strings.Length; i++)
			{
				if (strings[i].StartsWith(searchString))
				{
					return i;
				}
			}
			return -1;
		}

		// Indeksowanie przy użyciu łańcuchów znaków 
		public string this[string index]
		{
			get
			{
				if (index.Length == 0)
				{
					// Obsługa niepoprawnych indeksów
				}
				return this[FindString(index)];
			}
			set
			{
				// W tym miejscu nie trzeba sprawdzać wartości indeksów, ponieważ
				// niepoprawne indeksy obsługuje metoda FindString
				strings[FindString(index)] = value;
			}
		}

		// Informuje, ile łańcuchów znaków znajduje się na liście
		public int GetNumEntries()
		{
			return ctr;
		}
	}

	public class Tester
	{
		static void Main()
		{
			// Tworzenie nowej listy i inicjowanie jej
			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");

			// Testowanie dostępu
			string subst = "Wszechświecie";
			lbt[1] = subst;
			lbt["Wit"] = "Żegnaj";
			// lbt["xyz"] = "uups";

			// Dostęp do wszystkich łańcuchów znaków 
			for (int i = 0; i < lbt.GetNumEntries(); i++)
			{
				Console.WriteLine("lbt[{0}]: {1}", i, lbt[i]);
			} // Koniec for
		} // Koniec main
	} // Koniec tester
}
