2011-08-02 5 views
9

Comment implémenter IEnumerator sur cette classe pour pouvoir l'utiliser dans une boucle foreach.C# - Comment implémenter IEnumerator sur une classe

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; 
      } 
     } 
    } 

Dans cet exemple, Configuration est une classe simple avec peu de propriétés.

+0

duplication possible de [Comment implémenter l'interface IEnumerator?] (Http://stackoverflow.com/questions/53967/how-would-you-implement-the-ienumerator-interface) –

Répondre

11

Juste un exemple à mettre en œuvre typesafe IEnumerable et non IEnumerator que vous serez en mesure d'utiliser dans la boucle 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(); 
     } 
    } 

Cordialement.

+0

Merci @Tigran, ça marche pour moi – Riz

+0

Vous venez d'utiliser l'implémentation de la classe Dictionary, donc techniquement vous n'implémentez pas IEnumerator :-). – Sebastian

+0

@ Je l'implémente en utilisant la classe de dictionnaire ci-dessous. – Tigran

1

Vous n'avez pas besoin d'implémenter IEnumerable ou toute autre interface. Pour pouvoir utiliser votre classe dans un foreach, tout ce que vous avez besoin est d'ajouter une méthode d'instance de votre classe avec la signature follwing:

IEnumerator GetEnumerator() 
+1

Je ne le savais pas! Enregistre l'effort redondant, car 'IEnumerable ' hérite de 'IEnumrable' qui crée un désordre ennuyeux. –

2

Vous devriez être en mesure de mettre en œuvre IEnumerator comme ceci:

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 
    } 
} 

Mais comme déjà noté, vous pouvez également implémenter IEnumerable.

+0

Comme Tigran, vous utilisez simplement l'énumérateur de la classe Dictionary. – Sebastian

+0

J'ai essayé de mettre en place un moi-même avec votre poste, mais j'ai remarqué que votre courant ne s'incrémente jamais. Je pense que vous vouliez faire ça dans MoveNext()? – radonthetyrant

+0

La variable 'current' doit être initialisée avec -1 (à la fois dans le constructeur et dans la méthode Reset). –

Questions connexes