我正在制作密码生成器,我有三个复选框:小写,大写和数字。现在我有一个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;
}
等等。这种方法非常低效。我在制作收银机计划时遇到了这个问题(10种浇头选择,检查你想要的,并且程序将价格加在一起。如果你取消选中顶部,价格将减去该数量。)所以我只是放弃了它。但现在,我决心找到一种隐喻购物的方法。
答案 0 :(得分:5)
虽然您的代码不是很清楚,但您似乎能够连续调用这些方法。那么为什么不这样做呢;
if (check1.Checked)
Generate.lowercase();
if (check2.Checked)
Generate.uppercase();
if (check3.Checked)
Generate.number();
此外,您可能希望为控件和变量使用更具描述性的名称。
答案 1 :(得分:1)
if(check1.checked) Generate.lowercase();
if(check2.checked) Generate.uppercase();
...
答案 2 :(得分:0)
所以你真正需要做的就是找到一种选择动态的方法。一种方法是创建一个函数列表,其中每个函数都能够生成一个值。在开始时,根据选中的内容使用相关函数填充列表,然后您可以使用一个循环来简单地选择该列表中的一个函数:
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();
请注意,不是在循环中重复将字符附加到字符串,而应使用StringBuilder
来避免不断重新分配和复制值。
我还建议为checkbox
变量使用更有意义的名称;它使代码更具可读性。
答案 3 :(得分:0)
这取决于您使用的框架以及您应用的模式,但有更好的方法可以做到这一点。您可以使用位标志并将复选框和它们放在一起。
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代码)
答案 4 :(得分:0)
你可以简单地拆分它们:
if (check1.checked) Generate.lowercase();
if (check2.checked) Generate.upperrcase();
if (check3.checked) Generate.number();
逻辑上,这种方式和分组方式之间没有。
答案 5 :(得分:0)
在密码生成的情况下,@ Gerald Versluis的答案非常值得一看。
在购物的情况下,你有口味。 “检查”关闭口味,以后加上“已检查”的价格,它只是不能很好地扩展,正如您已经意识到的那样。
在这种情况下,最好将一个味道添加到列表中,然后计算总计。
这也可以应用于密码生成。你添加不同的“密码”生成器,从而使它更好地扩展,并使用C#伟大的OOP功能。这里的热门词是:Polymorhism