Могу ли я метод возвращения IEnumerator <T> и использовать его в цикле Еогеасп?

голоса
16

Мне нужно установить высоту каждого текстового поля на моей форме, некоторые из которых вложены в другие элементы управления. Я думал, что я мог бы сделать что-то вроде этого:

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

С его помощью, как это:

foreach(TextBox textBox in FindTextBoxes(this))
{
    textBox.Height = height;
}

Но, конечно , компилятор выплевывает его соску, потому что Еогеасп ожидает IEnumerable , а не IEnumerator .

Есть ли способ сделать это без того , чтобы создать отдельный класс с GetEnumerator () метод?

Задан 06/08/2008 в 13:17
источник пользователем
На других языках...                            


5 ответов

голоса
13

Как компилятор говорит вам, что вам нужно изменить тип возврата к IEnumerable. Вот как работает обратный выход синтаксис.

Ответил 06/08/2008 d 13:19
источник пользователем

голоса
9

Просто для уточнения

private static IEnumerator<TextBox> FindTextBoxes(Control rootControl)

Изменения в

private static IEnumerable<TextBox> FindTextBoxes(Control rootControl)

Это должно быть все :-)

Ответил 09/08/2008 d 00:34
источник пользователем

голоса
3

Если вы вернетесь IEnumerator, это будет другой объект Перечислитель каждый раз вызывать этот метод (действующее как бы вы сбросить нумератор на каждой итерации). Если вы возвращаете IEnumerable то Еогеасп может перечислить на основе метода с утверждением доходности.

Ответил 06/08/2008 d 14:04
источник пользователем

голоса
1
// Generic function that gets all child controls of a certain type, 
// returned in a List collection
private static List<T> GetChildTextBoxes<T>(Control ctrl) where T : Control{
    List<T> tbs = new List<T>();
    foreach (Control c in ctrl.Controls) {
        // If c is of type T, add it to the collection
        if (c is T) { 
            tbs.Add((T)c);
        }
    }
    return tbs;
}

private static void SetChildTextBoxesHeight(Control ctrl, int height) {
    foreach (TextBox t in GetChildTextBoxes<TextBox>(ctrl)) {
        t.Height = height;
    }
}
Ответил 06/08/2008 d 13:32
источник пользователем

голоса
0

Если вы получаете нумератор, и нужно использовать его в наличии для каждого цикла, вы можете использовать следующие заворачивать:

статический открытый класс enumerationHelper
{
    общественный класс enumeratorHolder <T>
    {
        частный T theEnumerator;
        общественных Т GetEnumerator () {вернуть theEnumerator; }
        общественного enumeratorHolder (Т newEnumerator) {theEnumerator = newEnumerator;}
    }
    статические enumeratorHolder <T> toEnumerable <Т> (Т theEnumerator) {вернуть новый enumeratorHolder <T> (theEnumerator); }
    частный класс IEnumeratorHolder <T>: IEnumerable <T>
    {
        частный IEnumerator <T> theEnumerator;
        общественного IEnumerator <T> GetEnumerator () {вернуть theEnumerator; }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator () {вернуть theEnumerator; }
        общественного IEnumeratorHolder (IEnumerator <T> newEnumerator) {theEnumerator = newEnumerator; }
    }
    статические IEnumerable <T> toEnumerable <Т> (IEnumerator <T> theEnumerator) {вернуть новый IEnumeratorHolder <T> (theEnumerator); }
}

toEnumerableМетод будет принимать что - либо , что или бы расценить приемлемый тип возвращаемого из GetEnumerator, и вернуть то , что может быть использовано в foreach. Если параметр является IEnumerator<>ответ будет IEnumerable<T>, хотя вызов GetEnumeratorна него один раз, скорее всего , дают плохие результаты.

Ответил 14/07/2011 d 20:09
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more