C# 不使用if组合复选框

C# 不使用if组合复选框,c#,C#,我正在制作一个密码生成器,我有三个复选框:小写、大写和数字。现在我有一个IF声明,上面说: IF (check1.checked == true & check2.checked == true & check3.checked == true) { length = Convert.ToInt32(lengthTextBox.Text); string password = "";

我正在制作一个密码生成器,我有三个复选框:小写、大写和数字。现在我有一个IF声明,上面说:

    IF (check1.checked == true & check2.checked == true & check3.checked == true)
       {
           length = Convert.ToInt32(lengthTextBox.Text);
                string password = "";
                int choice;
                Generate gen = new Generate();
                for (int i = 1; i <= length; i++)
                {
                    choice = rnd.Next(1, 4);
                    if (choice == 1)
                    {
                        password = password + gen.lower();
                    }
                    else if (choice == 2)
                    {
                        password = password + gen.upper();
                    }
                    else if (choice == 3)
                    {
                        password = password + gen.number();
                    }
                }

                passwordTextBox.Text = password;
       }
    Else IF (check1.checked == true & check2.checked == true)
    {
            length = Convert.ToInt32(lengthTextBox.Text);
                string password = "";
                int choice;
                Generate gen = new Generate();
                for (int i = 1; i <= length; i++)
                {
                    choice = rnd.Next(1, 3);
                    if (choice == 1)
                    {
                        password = password + gen.lower();
                    }
                    else if (choice == 2)
                    {
                        password = password + gen.upper();
                    }
                }

                passwordTextBox.Text = password;
    }
IF(check1.checked==true&check2.checked==true&check3.checked==true)
{
长度=Convert.ToInt32(lengthTextBox.Text);
字符串密码=”;
智力选择;
Generate gen=new Generate();

对于(inti=1;i虽然不清楚代码的功能,但您似乎能够连续调用这些方法

if (check1.Checked)
   Generate.lowercase();

if (check2.Checked)
   Generate.uppercase();

if (check3.Checked)
   Generate.number();

此外,您可能还希望为控件和变量使用更多描述性名称。

因此,您在这里真正需要做的是找到一种使选择动态的方法。一种方法是创建一个函数列表,其中每个函数都能够生成一个值。在开始时,您用t填充该列表根据检查的内容创建相关函数,然后您可以有一个循环,只需从该列表中选择一个函数:

if(check1.checked) Generate.lowercase();
if(check2.checked) Generate.uppercase();
...
List<Func<char>> generators = new List<Func<char>>();
if (lowercaseCheckbox.Checked)
    generators.Add(() => gen.lowercase());

if (uppercaseCheckbox.Checked)
    generators.Add(() => gen.uppercase());

if (numberCheckbox.Checked)
    generators.Add(() => gen.number());

int length = Convert.ToInt32(lengthTextBox.Text);
StringBuilder password = new StringBuilder();
Random random = new Random();
for (int i = 0; i < length; i++)
{
    int choice = random.Next(generators.Count);
    password.Append(generators[choice]());
}
string result = password.ToString();
列表生成器=新列表();
if(小写的checkbox.Checked)
generators.Add(()=>gen.lowercase());
如果(大写复选框。选中)
generators.Add(()=>gen.uppercase());
如果(选中编号ECKBOX)
generators.Add(()=>gen.number());
int length=Convert.ToInt32(lengthTextBox.Text);
StringBuilder密码=新建StringBuilder();
随机=新随机();
for(int i=0;i
请注意,与其在循环中重复向字符串添加字符,不如使用
StringBuilder
,以避免不断地重新分配和复制值


我还建议为
复选框
变量使用更有意义的名称;这会使代码更具可读性。

这取决于您使用的框架和应用的模式,但有更好的方法可以做到这一点。您可以使用位标志,并将复选框和它们结合在一起

FlagVariable output = FlagVariable.None;
if( topping1.IsChecked )
{
    output &= FlagVariable.Topping1;
}
if( topping2.IsChecked )
{
    output &= FlagVariable.Topping2;
}
// etc...
后来

if( output | FlagVariable.Topping1 )
{
    // it has topping 1
}

这是非常有效和可维护的。您仍然需要在复选框及其相应的标志值之间编写关联代码(这部分取决于您的框架/模式,因为在使用MVVM的WPF中,您可能可以避免很多if-then代码)。

您可以简单地将它们拆分:

if (check1.checked) Generate.lowercase();
if (check2.checked) Generate.upperrcase();
if (check3.checked) Generate.number();

从逻辑上讲,这种方式和分组方式之间没有任何区别。

在生成密码的情况下@Gerald Versluis的答案绝对值得一看

就购物而言,你有味道。“勾选”味道,稍后再加上“勾选”味道的价格,正如你已经意识到的那样,它不能很好地扩展。
在这种情况下,最好将口味添加到列表中,然后将其计算为总数


这也可以应用于密码生成。在其中添加不同的“密码”生成器,从而使它更好地缩放,并使用C ^伟大的OOP能力。这里的嗡嗡词是:<代码>多义主义< /代码>

你所调用的方法是什么?我欣赏它们都有助于密码,但是小写和大写具体做什么?也可以考虑使用& &操作符。它不会造成任何错误。这里的效率很低,因为这是一个很小的规模,但是在相关场景中使用&&or&是一个很好的实践。你不需要任何
==true
,在那里^很好地找到了。另外,“Else If”会在编译时抛出一个错误。你测试过这个吗?这段代码有什么不好的地方吗?只有3个可能的项,所以pos的数量ible组合只有6个。这意味着您将只有6个if语句。这并不是很低效。@Nunners但开发人员在其中某个地方出错的概率相当大,因为所有繁琐的键入或复制/粘贴错误的可能性都很大,代码的可读性也受到很大影响。它在阅读代码时,如果代码正确与否,以及代码中是否存在错误,一眼就能看出这一点并不容易。根据OP更新的代码片段,此解决方案无效。回答了我的收银机问题,但不是我的生成器问题。谢谢。这就是我一直在寻找的问题!