Hacer una clase enumerable con foreach

1981 vistas

Puede ser interesante hacer una clase que pueda ser recorrida mediante un foreach. Para ello es necesario que la clase pueda proveer un objeto IEnumerator y que implemente la interfaz IEnumerable para sobrecargar los métodos MoveNext y Reset y permitiendo el acceso a la propiedad Current.

Veamos el ejemplo de una clase MyString que lo implementa (esto sólo sirve de ejemplo ya que la clase String ya lo permite).



csharp
  1. public class MyString :  IEnumerable, IEnumerator
  2. {
  3.     private    string string_;
  4.     private    int i;
  5.     public MyString()
  6.     {
  7.         string_ = "";
  8.         i = -1;
  9.     }
  10.     public MyString(string c)
  11.     {
  12.         string_ = c;
  13.         i = -1;
  14.     }
  15.     public virtual bool MoveNext()
  16.     {
  17.         if ( i < string_.Length - 1 )
  18.         {
  19.             i++;
  20.             return true;
  21.         }
  22.         return false;
  23.     }
  24.     public virtual void Reset() {}
  25.     public Object Current
  26.     {
  27.         get
  28.         {
  29.             return string_[i];
  30.         }
  31.     }
  32.     public virtual IEnumerator GetEnumerator()
  33.     {
  34.         return this;
  35.     }
  36. }



Hay que resaltar el método GetEnumerator que devuelve this.

Otra solución podrÃa ser usar una estructura nested impementando IEnumerator.