Puis-je avoir une méthode retournant IEnumerator<T>, et l'utiliser dans une boucle foreach?
J'ai besoin de régler la hauteur de chaque zone de texte sur mon formulaire, dont certains sont imbriqués dans d'autres contrôles. Je pensais que je pouvais faire quelque chose comme ceci:
private static IEnumerator<TextBox> FindTextBoxes(Control rootControl)
{
foreach (Control control in rootControl.Controls)
{
if (control.Controls.Count > 0)
{
//Recursively search for any TextBoxes within each child control
foreach (TextBox textBox in FindTextBoxes(control))
{
yield return textBox;
}
}
TextBox textBox2 = control as TextBox;
if (textBox2 != null)
{
yield return textBox2;
}
}
}
De l'utiliser comme ceci:
foreach(TextBox textBox in FindTextBoxes(this))
{
textBox.Height = height;
}
Mais bien sûr, le compilateur crache ses factice, parce que foreach s'attend à une IEnumerable plutôt qu'un IEnumerator.
Est-il un moyen de le faire sans avoir à créer une classe séparée avec un GetEnumerator() méthode?
En fait,
foreach
ne vous attendez pas à un IEnumerable
à tous (ni un IEnumerable<T>
). Il ne s'attend à quelque chose qui a une GetEnumerator
méthode. Cette méthode, à leur tour, ne doivent pas nécessairement retourner un IEnumerator
ou IEnumerator<T>
— il seulement besoin de retourner quelque chose qui a une MoveNext()
méthode et un Current
de la propriété.OriginalL'auteur littlecharva | 2008-08-06
Vous devez vous connecter pour publier un commentaire.
Que le compilateur est vous dire, vous avez besoin de changer le type de retour de IEnumerable. C'est ainsi que le taux de retour syntaxe fonctionne.
yield return
peut être utilisé avec les méthodes de retourIEnumerable<T>
ouIEnumerator<T>
. C'est seulement dans leforeach
boucle oùIEnumerator<T>
ne peut pas être utilisé.OriginalL'auteur David Wengier
Juste pour clarifier
Changements à
Qui convient à tous 🙂
OriginalL'auteur Orion Edwards
Si vous retournez IEnumerator, ça sera un autre objet énumérateur chaque appel de la méthode (agissant comme si vous réinitialisez l'agent recenseur à chaque itération). Si vous retournez IEnumerable puis un foreach peut énumérer basée sur la méthode avec l'instruction rendement.
OriginalL'auteur Joseph Daigle
OriginalL'auteur Yaakov Ellis
Si vous êtes donné un agent recenseur, et le besoin de l'utiliser dans une boucle for-each, vous pouvez utiliser les éléments suivants pour l'envelopper:
La
toEnumerable
méthode d'accepter tout ce qui c# ou vb serait un rendement acceptable type deGetEnumerator
, et le retour de quelque chose qui peut être utilisé dansforeach
. Si le paramètre est unIEnumerator<>
la réponse sera unIEnumerable<T>
, bien que l'appel deGetEnumerator
une fois donnera probablement des mauvais résultats.OriginalL'auteur supercat