Я новичок, и я хочу спросить, как сделать этот код более простым и коротким. Спасибо за все ответы.

public static bool SelectedSingleAcc(SpecialForms.AccountManager am)
{
    //checkbox1
    if (am.selectedCB1.Checked == true 
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox2
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == true  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox3
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == true  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox4
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == true  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox5
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == true  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox6
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == true  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == false) return true;
    //checkbox7
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == true  
        && am.selectedCB8.Checked == false) return true;
    //checkbox8
    if (am.selectedCB1.Checked == false  
        && am.selectedCB2.Checked == false  
        && am.selectedCB3.Checked == false  
        && am.selectedCB4.Checked == false  
        && am.selectedCB5.Checked == false  
        && am.selectedCB6.Checked == false  
        && am.selectedCB7.Checked == false  
        && am.selectedCB8.Checked == true) return true;
            
    return false;
}
-2
Šimon Novák 3 Фев 2022 в 09:52
Проанализируйте свою логику и напишите вложенные ifs. или сохраните свою комбинацию ввода/вывода в словаре и посмотрите результат.
 – 
Franz Gleichmann
3 Фев 2022 в 09:54
6
Используйте набор переключателей
 – 
Caius Jard
3 Фев 2022 в 09:56
Было бы полезно, если бы вы описали, для чего предназначена логика, а не полагаетесь на то, что мы реконструируем намерение из кода, который, как вы уже знаете, трудно читать.
 – 
Damien_The_Unbeliever
3 Фев 2022 в 09:58
1
Я голосую за то, чтобы закрыть этот вопрос с его "нет фактической проблемы, которую нужно решить", звучит как улучшение кода и/или обзор, и если это так, это может быть не по теме для SO. Он может лучше подходить для другого сайта SE, но не забудьте прочитать соответствующий FAQ; и/или изменить формулировку вашего вопроса по мере необходимости перед перекрестной публикацией. Как спросить. Удачи!
 – 
MickyD
3 Фев 2022 в 10:00
1
Я согласен с @CaiusJard - флажки предназначены для множественного выбора, для одного выбираемого элемента вместо этого используйте переключатели.
 – 
Zohar Peled
3 Фев 2022 в 10:08

3 ответа

Лучший ответ
// get all values into an array for easier handling:
values = new[] 
{
    am.selectedCB1.Checked,
    am.selectedCB2.Checked,
    am.selectedCB3.Checked,
    am.selectedCB4.Checked,
    am.selectedCB5.Checked,
    am.selectedCB6.Checked,
    am.selectedCB7.Checked,
    am.selectedCB8.Checked,
};

// find out if exactly one is true
return values.Count(val => val == true) == 1;

Тем не менее... правильным решением для пользовательского интерфейса было бы использование переключателей вместо флажков. Они уже реализуют эту логику для вас. И каждый раз, когда вы ловите себя на том, что нумеруете свои переменные, вы должны хорошенько подумать о том, почему это не должно быть массивом, а не множеством одиночных переменных.

6
nvoigt 3 Фев 2022 в 09:58
Или Count(val => val)
 – 
Caius Jard
3 Фев 2022 в 10:17
1
Возможно, .Any(val => val == true) или .Any(val) для проверки истинности любого из пунктов.
 – 
Yong Shun
3 Фев 2022 в 10:19
public static bool SelectedSingleAcc(SpecialForms.AccountManager am)
        {
            int checkedNumbers = 0;
            if (am.selectedCB1.Checked) checkedNumbers++;
            if (am.selectedCB2.Checked) checkedNumbers++;
            if (am.selectedCB3.Checked) checkedNumbers++;
            if (am.selectedCB4.Checked) checkedNumbers++;
            if (am.selectedCB5.Checked) checkedNumbers++;
            if (am.selectedCB6.Checked) checkedNumbers++;
            if (am.selectedCB7.Checked) checkedNumbers++;
            if (am.selectedCB9.Checked) checkedNumbers++;
            
            if (checkedNumbers == 1) //only one checkbox selected, we think the result is true
                 return true;
            
            return false;
            
        }
2
navylover 3 Фев 2022 в 10:01

Итак, похоже, вы проверяете, что установлен не более одного флажка, n возвращает true, иначе возвращает false

Поскольку для того, чтобы даже появиться в форме, элементы управления должны быть добавлены в коллекцию элементов управления, мы можем выполнять поиск по ней (используя LINQ) в поисках элементов управления, соответствующих критериям. В этом случае мы просматриваем элементы управления на наличие флажков и подсчитываем те, чье имя начинается с «selectedCB» и чье состояние проверено. Мы сравниваем количество с 1, и если есть только 1, то результат истинный, если есть 0 или 2+, результат ложный:

return p.Controls
  .OfType<Checkbox>()
  .Count(c => c.Name.StartsWith("selectedCB") && c.Checked) == 1;
  • p – это имя панели/группы, в которой находятся флажки.

  • Если они указаны прямо в форме, используйте this (или имя переменной формы, если этот код не является частью формы, содержащей поля).

  • Если на панели/форме нет других флажков, вы можете убрать c.Name.StartsWith.... Проверка имени предназначена исключительно для остановки, например. ваш isActiveCheckbox проверяется и, следовательно, также загрязняет счет

  • Если есть другие флажки, также имеющие имя, начинающееся с «selectedCB», было бы проще переименовать их так, чтобы только эти 8 флажков имели имя, начинающееся с «selectedCB», или поместить их на свою собственную панель, но добавить комментарий, если вам нужна более совершенная логика, например регулярное выражение, которое настаивает на том, чтобы имя было selectedCB[1-8]

2
Caius Jard 3 Фев 2022 в 10:16