Оптимизация метода флажков - PullRequest
0 голосов
/ 19 марта 2020

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

private void CheckCBEnabled()
{
    int upToThree = 0;
    if (MondayCB.Checked)
    {
        upToThree++;
    }
    if (TuesdayCB.Checked)
    {
        upToThree++;
    }
    if (WednesdayCB.Checked)
    {
        upToThree++;
    }
    if (ThursdayCB.Checked)
    {
        upToThree++;
    }
    if (FridayCB.Checked)
    {
        upToThree++;
    }
    if (upToThree >= 3)
    {
        WeekDaysP.Enabled = false;
    }
    return;
}

Любой совет, как я могу оптимизировать / оптимизировать эффективность кода?

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Сделайте так, чтобы ваши CheckBoxes подписывались на событие CheckedChanged, используя тот же обработчик события (выберите их все и дважды щелкните событие в конструкторе форм).

  • Когда CheckState одного из CheckBoxes изменяется, событие вызывается.
    Проверьте, проверены ли 3 из этих Controls и, если условие выполнено, отключите CheckBoxes, которые не проверено.
  • Если выбрано менее 3, включите те, которые в конечном итоге отключены (чтобы вы могли изменить выбор, если это необходимо).


private void checkBoxes_CheckedChanged(object sender, EventArgs e)
{
    var checkBoxes = (sender as Control).Parent.Controls.OfType<CheckBox>();
    var checkedCount = checkBoxes.Count(c => c.Checked);

    checkBoxes.ToList().ForEach(c => {
        if (!c.Checked) {
            c.Enabled = checkedCount != 3;
        }
    });
}

Если в этом контейнере есть другие флажки, переместите те, которые являются частью этого выбора , в свои собственные , отдельно, контейнер (другая панель), поэтому нет путаницы

0 голосов
/ 19 марта 2020

Вы можете добавить к List<CheckBox> и использовать linq, что-то вроде этого:

    List<CheckBox> weekdayCBs;
    private void Form_Load(object sender, EventArgs e)
    {
        weekdayCBs = new List<CheckBox> { MondayCB, TuesdayCB, WednesdayCB, ThursdayCB, FridayCB };
    }

    private void CheckCBEnabled()
    {
        WeekDaysP.Enabled = weekdayCB.Count(cb => cb.Checked) >= 3;
    }

РЕДАКТИРОВАТЬ: В качестве отступления, и это уже упоминалось в комментариях, вы специально попросили оптимизация , и ваш код близок к оптимальному с точки зрения количества операций (я могу вспомнить пару небольших оптимизаций, но они были бы почти несущественными). Перезапись, подобная приведенной выше, обеспечивает гораздо большую читабельность за счет небольшого объема служебной информации. Как правило, это хорошо, особенно когда речь идет о пользовательских интерфейсах, где незначительные оптимизации не будут замечены пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...