2009-11-26 4 views
1

J'ai une classe de collection qui contient 1 propriété - un tableau d'une sous-classe.C#, comment utiliser IEnumerator dans une classe définie par l'utilisateur

Par souci de la question. J'ai une classe de panier, puis des fruits [] comme la seule propriété du panier. La classe de fruits contient 3 propriétés par exemple. Nom, couleur et taille.

Comment puis-je faire en sorte que la classe de panier se comporte de sorte que je puisse utiliser des boucles foreach dessus?

Répondre

3

Dans ce cas simple, vous pouvez déléguer l'énumération au tableau, comme ceci:

public class Basket: IEnumerable { 
    private Fruit[] fruits; 

    public IEnumerator getEnumerator() { 
    return fruits.GetEnumerator(); 
    } 
} 
+3

Je recommanderais d'utiliser le IEnumerator générique , bien que la array devrait être casté à un IEnumerable pour le faire – thecoop

+0

Oui, j'ai pensé à faire le générique. Cependant, alors vous avez besoin de deux implémentations 'GetEnumerator' (la non-générique en tant qu'implémentations d'interface explicite, implicite générique), ce qui peut être quelque peu déroutant car cela ajoute du bruit. Mais vous avez raison, de nos jours, il faut implémenter l'interface générique dans le code de production. – Lucero

4

De ce que vous avez déjà, vous êtes en mesure de le faire:

foreach(fruit f in myBasket.fruits) { ... } 

est-ce pas assez bon? si vous voulez utiliser foreach(fruit f in myBasket), vous pouvez mettre en œuvre IEnumerable et dans votre méthode getEnumerator juste bulle l'appel à fruits.getEnumerator, mais vraiment, je pense que dans ce cas, je préférerais avoir panier hériter d'une liste de fruits:

public class Basket : List<Fruit>() { ... } 

et vous n'utiliserez pas du tout le membre privé fruits.

3

Bien qu'il puisse être plus souhaitable de tirer de List<Fruit> ici est quelque chose pour vous aider à démarrer si pour une raison qui ne répond pas à vos besoins: -

public class Basket : IEnumerable<Fruit> 
{ 
    private Fruit[] myFruit; 

    public int Count { get; private set; } 

    public IEnumerator<Fruit> GetEnumerator() 
    { 
     for (int i = 0; i < Count; i++) 
      yield return myFruit[i]; 
    } 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
Questions connexes