我可以有一个方法返回IEnumerator <T>并在foreach循环中使用它吗?

lit*_*rva 20 c# ienumerable ienumerator foreach

我需要设置表单上每个文本框的高度,其中一些文本框嵌套在其他控件中.我以为我可以这样做:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

foreach(TextBox textBox in FindTextBoxes(this))
{
    textBox.Height = height;
}
Run Code Online (Sandbox Code Playgroud)

但是编译器当然会吐出它的假,因为foreach期望IEnumerable而不是IEnumerator.

有没有办法在不必使用GetEnumerator()方法创建单独的类的情况下执行此操作?

Dav*_*ier 14

正如编译器告诉你的那样,你需要将返回类型更改为IEnumerable.这就是yield return语法的工作原理.

  • `yield return`可以与返回**IEnumerable <T>`*或*`IEnumerator <T>`的方法一起使用.它只在`foreach`循环中,不能使用`IEnumerator <T>`. (7认同)

Ori*_*rds 10

只是为了澄清

private static IEnumerator<TextBox> FindTextBoxes(Control rootControl)
Run Code Online (Sandbox Code Playgroud)

改变为

private static IEnumerable<TextBox> FindTextBoxes(Control rootControl)
Run Code Online (Sandbox Code Playgroud)

这应该是全部:-)