2011-08-02 11 views
9

Cómo implementar IEnumerator en esta clase para que pueda usarlo en el bucle foreach.C# - Cómo implementar IEnumerator en una clase

public class Items 
    { 
     private Dictionary<string, Configuration> _items = new Dictionary<string, Configuration>(); 

     public Configuration this[string element] 
     { 
      get 
      { 

       if (_items.ContainsKey(element)) 
       { 
        return _items[element]; 
       } 
       else 
       { 
        return null; 
       } 
      } 

      set 
      { 
       _items[element] = value; 
      } 
     } 
    } 

En este ejemplo, la configuración es una clase simple con pocas propiedades.

+0

posible duplicado de [¿Cómo implementaría la interfaz IEnumerator?] (Http://stackoverflow.com/questions/53967/how-would-you-implement-the-ienumerator-interface) –

Respuesta

11

Apenas un ejemplo para implementar typesafe IEnumerable y no IEnumerator que usted podrá utilizar en el bucle foreach.

public class Items : IEnumerable<Configuration> 
    { 
     private Dictionary<string, Configuration> _items = new Dictionary<string, Configuration>(); 


     public void Add(string element, Configuration config) { 
      _items[element] = config; 
     } 

     public Configuration this[string element] 
     { 
      get 
      { 

       if (_items.ContainsKey(element)) 
       { 
        return _items[element]; 
       } 
       else 
       { 
        return null; 
       } 
      } 

      set 
      { 
       _items[element] = value; 
      } 
     } 

     public IEnumerator<Configuration> GetEnumerator() 
     { 
      return _items.Values.GetEnumerator(); 
     } 

     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
     { 
      return _items.Values.GetEnumerator(); 
     } 
    } 

Saludos.

+0

Gracias @Tigran, funciona para mí – Riz

+0

Usted acaba de usar la Implementación de la Clase de diccionario, por lo que técnicamente no está implementando IEnumerator :-). – Sebastian

+0

@ Lo estoy implementando, utilizando debajo la clase de diccionario. – Tigran

1

No necesita implementar IEnumerable o cualquier interfaz. Con el fin de poder utilizar su clase en un foreach, todo lo que necesita es agregar un método de instancia de la clase con la firma siguientes aparatos:

IEnumerator GetEnumerator() 
+1

¡No sabía esto! Ahorra esfuerzo redundante, ya que 'IEnumerable ' hereda de 'IEnumrable', lo que crea un desorden molesto. –

2

usted debería ser capaz de implementar IEnumerator así:

public class Items : IEnumerator<KeyValuePair<string, Configuration>> 
{   
    private Dictionary<string, Configuration> _items = new Dictionary<string, Configuration>();   
    public Configuration this[string element]  
    {    
     get 
     { 
      if (_items.ContainsKey(element)) 
      { 
       return _items[element]; 
      } 
      else 
      { 
       return null; 
      } 
     } 
     set 
     { 
      _items[element] = value; 
     } 
    } 

    int current; 
    public object Current 
    { 
     get { return _items.ElementAt(current); } 
    } 

    public bool MoveNext() 
    { 
     if (_items.Count == 0 || _items.Count <= current) 
     { 
      return false; 
     } 
     return true; 
    } 

    public void Reset() 
    { 
     current = 0; 
    } 

    public IEnumerator GetEnumerator() 
    { 
     return _items.GetEnumerator(); 
    } 

    KeyValuePair<string, Configuration> IEnumerator<KeyValuePair<string, Configuration>>.Current 
    { 
     get { return _items.ElementAt(current); } 
    } 

    public void Dispose() 
    { 
     //Dispose here 
    } 
} 

Pero como ya se ha mencionado, también podría implementar IEnumerable.

+0

Al igual que Tigran, solo usa el Enumator de la clase de diccionario. – Sebastian

+0

Intenté implementar uno yo mismo con su publicación, pero noté que su actual nunca se incrementa. Creo que querías hacer eso en MoveNext()? – radonthetyrant

+0

La variable 'current' tiene que inicializarse con -1 (tanto en el constructor como en el método Reset). –

Cuestiones relacionadas