Member 10877592 Ответов: 5

C#, пожалуйста, помогите изменить мой цикл foreach на for loop


Как я могу изменить свой цикл foreach на цикл for? Мне нужно измерить производительность между ними.

спасибо

Что я уже пробовал:

public void ClearAllTextBoxes(Control controls)
     {
         foreach (Control control in controls.Controls)
         {
             if (control is TextBox)
             {
                 ((TextBox)control).Clear();
             }
             if (control.HasChildren)
             {
                 ClearAllTextBoxes(control);
             }
         }
     }

BillWoodruff

"Мне нужно измерить производительность между ними."

Что это значит ? Между чем ?

5 Ответов

Рейтинг:
38

CPallini

(Не тестировать)

public void ClearAllTextBoxes(Control controls)
     {
         int n;
         for (n=0; n<controls.Controls.Count; ++n)
         {
             Control control = control.Controls[n];
             if (control is TextBox)
             {
                 ((TextBox)control).Clear();
             }
             if (control.HasChildren)
             {
                 ClearAllTextBoxes(control);
             }
         }
     }


Maciej Los

5

CPallini

Спасибо тебе, Мацей!

Рейтинг:
30

V.

Что-то в этом роде ... :

for(int i = 0; i < controls.Controls.Count; i++){
   if (controls.Controls[i] is TextBox)
             {
                 ((TextBox)controls.Controls[i]).Clear();
             }
             if (controls.Controls[i].HasChildren)
             {
                 ClearAllTextBoxes(controls.Controls[i]);
             }
}


Это задокументировано и является основным .Чистое знание.


Maciej Los

5

Member 10877592

спасибо

Рейтинг:
2

BillWoodruff

Я предпочитаю обрабатывать такие рекурсивные манипуляции методами расширения.

Используйте примеры:

this.ApplyToControls<TextBox>(tbx => tbx.Clear());

var tbxs = this.GetAllControlsOfType<TextBox>();

tbxs.ApplyToControlCollection<TextBox>(tbx => tbx.Clear());

tbxs.ApplyToControlCollection<TextBox>(tbx => tbx.Text = "default");
Код:
public static class ControlExtensions
{
    public static IEnumerable<T> GetAllControlsOfType<T>(this Control cntrl)
        where T : Control
    {
        var stack = new Stack<Control>(cntrl.Controls.Cast<Control>());

        while (stack.Any())
        {
            Control nextControl = stack.Pop();

            if (nextControl.HasChildren)
            {
                foreach (Control childControl in nextControl.Controls)
                {
                    stack.Push(childControl);
                }
            }

            if(nextControl is T) yield return nextControl as T;
        }
    }

    public static void ApplyToControlCollection<T>(this IEnumerable<T> instances, Action<T> action)
    {
        foreach (T instance in instances)
        {
            action(instance);
        }
    }

    public static void ApplyToControls<T>(this Control cntrl, Action<T> action)
    {
        foreach (T cinstance in cntrl.Controls.OfType<T>())
        {
            action(cinstance);
        }

        if (cntrl.HasChildren)
        {
            foreach (Control childcntrl in cntrl.Controls)
            {
                ApplyToControls<T>(childcntrl, action);
            }       
        }
    }
}


Рейтинг:
2

rakib hasan

for(int i = 0; i < controls.Управления.Граф; i++)
{
var control = контроль.Регулирование[я]
если (элемент управления "текстовое поле")
{
((Текстовое поле)управление).Четкий();
}
если (контроль.HasChildren)
{
ClearAllTextBoxes(управление);
}
}

Для того чтобы узнать глубоко смотрите здесь:См. Sharp


Рейтинг:
1

Joe Sonderegger

Эта версия использует самую современную форму C#.

public void ClearAllTextBoxes(Control controls)
{
    for (int n = 0; n < controls.Controls.Count; n++)
    {
         var control = control.Controls[n];
         if (control is TextBox textBox)
         {
             textBox.Clear();
         }
         if (control.HasChildren)
         {
             ClearAllTextBoxes(control);
         }
    }
}


Maciej Los

5