gpt4 book ai didi

c# - 有没有一种更有效的方法可以根据选中的复选框来做事?

转载 作者:太空狗 更新时间:2023-10-30 01:02:46 26 4
gpt4 key购买 nike

我自己最近刚遇到这个问题,搜索这个问题还没有结果......

假设我有四个复选框,例如,我想根据随时选中的复选框来做某些事情...

if (CB1.Checked)
{
//Do things here if only checkbox 1 is checked.
}
else if (CB2.Checked)
{
//Do things here if only checkbox 2 is checked.
}
else if (CB3.Checked)
{
//Do things here if only checkbox 3 is checked.
}
else //if (CB4.Checked)
{
//Do things here if only checkbox 4 is checked.
}

我敢肯定大多数人会倾向于使用类似于上面的示例代码片段或其变体的东西。看起来很简单,对吧?但是,如果...您不只是单独检查一个复选框怎么办?

if (CB1.Checked && CB2.Checked)
{
//Do things here if only checkbox 1 & 2 is checked.
}
else if (CB2.Checked && CB3.Checked)
{
//Do things here if only checkbox 2 & 3 is checked.
}
else if (CB3.Checked && CB1.Checked)
{
//Do things here if only checkbox 3 & 1 is checked.
}
else if (CB4.Checked && CB1.Checked)
{
//Do things here if only checkbox 4 & 1 is checked.
}
else if (CB4.Checked && CB2.Checked)
{
//Do things here if only checkbox 4 & 2 is checked.
}
else //if (CB4.Checked && CB3.Checked)
{
//Do things here if only checkbox 4 & 3 is checked.
}

可以看出...if-else 语句的数量增加了...如果您想比较可能比 4 个更多的复选框,或者要比较 4 个中更多的复选框,它会增加...而且可能会使事情复杂化,(很可能)大多数程序员都无法避免它。

我还应该提到,由于这段代码,我知道在给定时间选中了多少个复选框:

private int GetNumberOfCheckboxesChecked()
{
int NumberofCheckBoxesChecked = 0;
foreach (Control c in groupBox1.Controls)
{
if ((c is CheckBox) && ((CheckBox)c).Checked)
NumberofCheckBoxesChecked++;
}

return NumberofCheckBoxesChecked;
}

他们还需要始终选中其中一个复选框,因为每个复选框的 checkchanged 事件都会调用此代码:

private void OneAtLeast(object originalSender)
{
CheckBox tempCB = (CheckBox)originalSender;
if (!CB1.Checked && !CB2.Checked && !CB3.Checked && !CB4.Checked)
{
tempCB.Checked = true;
MessageBox.Show("You must select at least one option!", "Invalid Operation", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

所以,我的问题是......是否有更好(或更有效,或可以减少代码行数)的方式来根据选中的复选框做事?还是我们真的坚持使用这种方法(或这种方法的变体)?

请注意,对于此示例,无论您根据选中的复选框做什么...都不能简单地“添加”或“附加”。

还应注意,switch-case 方法与此方法或多或少相同……因此很可能不会有什么不同。也一直是concluded elsewhere that if-statements are more efficient that switch-case.

最佳答案

您可以创建一个将 int 映射到 ActionFunc(或其他任何合适的)的字典,然后使用复选框设置整数位。一旦计算出整数,就可以在字典中查找它并分派(dispatch)给该方法。字典可以初始化一次。

例如

int option = 0;
if(CB1.Checked) option = option | 1;
if(CB2.Checked) option = option | 2;
if(CB3.Checked) option = option | 4;
if(CB4.Checked) option = option | 8;

if(!lookup.HasKey(option))
throw new NotSupportedException("I didn't expect that combination of options");

lookup[option]();

之前已初始化lookup的地方(可能是类的static成员)

lookup = new Dictionary<int,Action>();
lookup.Add(0,DoNothingNoOptionsSet);
lookup.Add(1,DoJustCB1);
lookup.Add(2,DoJustCB2);
lookup.Add(3,DoCB1AndCB2ButNeverCB4);
/* etc, for other valid options */

这也让您有机会为执行的每个函数应用描述性名称,将它们移出到单独的函数中,然后将具有通用功能的区域组合成更小的辅助函数.

关于c# - 有没有一种更有效的方法可以根据选中的复选框来做事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32436683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com