Я новичок, и я хочу спросить, как сделать этот код более простым и коротким. Спасибо за все ответы.
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;
}
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;
Тем не менее... правильным решением для пользовательского интерфейса было бы использование переключателей вместо флажков. Они уже реализуют эту логику для вас. И каждый раз, когда вы ловите себя на том, что нумеруете свои переменные, вы должны хорошенько подумать о том, почему это не должно быть массивом, а не множеством одиночных переменных.
Count(val => val)
.Any(val => val == true)
или .Any(val)
для проверки истинности любого из пунктов.
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;
}
Итак, похоже, вы проверяете, что установлен не более одного флажка, 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]
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.