IEnumerator og IEnumerable

To kjekke grensesnitt som alle C#-folk bør kunne er IEnumerator og IEnumerable.

Med disse kan man enkelt "loope" over innholdet i egne klasser man lager.


Eksempel på klasse hvor disse grensesnittene er støttet:

public class Garasje : IEnumerable
{
   private string[] kjøretøy;

   public Garasje(int plasser)
   {
      if (plasser < 1) throw new ArgumentException("Garasjen må ha minst 1 plass!");
      this.kjøretøy = new string[plasser];
   }

   public void parker(string kjøretøy)
   {
      for (int k = 0; k < kjøretøy.Length; k++)
      {
         if (this.kjøretøy[k] == null)
         {
            this.kjøretøy[k] = kjøretøy;
            kjøretøy = null;
            break;
         }
      }  

      if (kjøretøy != null)
      {
         throw new ArgumentOutOfRangeException("Ikke nok plass i garasjen!");
      }
   }

   public void kjørUt(string kjøretøy)
   {
      for (int k = 0; k < kjøretøy.Length; k++)
      {
         if (this.kjøretøy[k] == kjøretøy)
         {
            this.kjøretøy[k] = null;
            kjøretøy = null;
            break;
         }
      }

      if (kjøretøy != null)
      {
         throw new ArgumentOutOfRangeException("Kjøretøyet er ikke parkert i garasjen!");
      }
   }

   public IEnumerator GetEnumerator()
   {
      foreach (string k in kjøretøy)
      {
         yield return k;
      }
   }

   public IEnumerable ListKjøretøySortert()
   {
      string[] sorterteKjøretøy = new string[kjøretøy.Length];
      Array.Copy(kjøretøy, sorterteKjøretøy, kjøretøy.Length);
      Array.Sort(sorterteKjøretøy);

      foreach (string k in sorterteKjøretøy)
      {
         yield return k;
      }
   }
}

Her er det først funksjonalitet for å opprette garasjeplass, og så for å legge til og fjerne kjøretøy igjen. Enkelt, ukomplisert, kjedelig, og ikke poenget.

Poenget er de to siste metodene som utgjør den ønskede funksjonaliteten for å enkelt kunne «loope» over innholdet som her er kjøretøyene i garasjen.

For å teste at alt henger sammen:

class Program
{
   static void Main(string[] args)
   {
      // Opprett garasje og parker biler
      Garasje garasje = new Garasje(2);
      garasje.parker("Toyota Corolla");
      garasje.parker("Suzuki GSX F");

      // Skriv ut liste over parkerte kjøretøy
      Console.WriteLine("\nKjøretøy parkert i garasjen:");
      foreach (string kjøretøy in garasje) Console.WriteLine(kjøretøy);

      // Skriv ut liste over parkerte kjøretøy sortert
      Console.WriteLine("\nKjøretøy parkert i garasjen, sortert:");
      foreach (string kjøretøy in garasje.ListKjøretøySortert()) Console.WriteLine(kjøretøy);

      // Kjører ut motorsykkelen
      Console.WriteLine("\nKjører ut motorsykkelen .. ");
      garasje.kjørUt("Suzuki GSX F");

      // Skriv ut liste over parkerte kjøretøy
      Console.WriteLine("\nKjøretøy parkert i garasjen:");
      foreach (string kjøretøy in garasje) Console.WriteLine(kjøretøy);

      Console.ReadLine();
   }
}

.. dette gir:

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.