-3

私はパスワード ジェネレーターを作成しており、小文字、大文字、数字の 3 つのチェック ボックスがあります。現在、次のような 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種類のトッピングの中から好きなトッピングにチェックを入れると、プログラムが価格を足し合わせます。トッピングのチェックを外すと、その分だけ価格が差し引かれます)を作成しているときに、この問題に遭遇したので、それをあきらめただけです。しかし今、私は比喩的に買い物に行く方法を見つけようと決心しています.

4

6 に答える 6

4

あなたのコードが何をするのかは明確ではありませんが、メソッドを連続して呼び出すことができるようです。では、このようにしてみませんか。

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

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

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

また、コントロールと変数には、よりわかりやすい名前を使用する必要があります。

于 2013-10-07T14:56:29.227 に答える
1
if(check1.checked) Generate.lowercase();
if(check2.checked) Generate.uppercase();
...
于 2013-10-07T14:56:31.853 に答える
0

したがって、ここで本当に必要なことは、選択肢の選択を動的にする方法を見つけることです。これを行う 1 つの方法は、各関数が値を生成できる関数のリストを作成することです。最初に、チェックした内容に基づいて関連する関数をリストに入力します。次に、そのリストから関数の 1 つを選択するだけの単一のループを作成できます。

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定数の再割り当てと値のコピーを避けるために a を使用する必要があることに注意してください。

checkboxまた、変数にはより意味のある名前を使用することをお勧めします。これにより、コードがはるかに読みやすくなります。

于 2013-10-07T14:56:35.253 に答える
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 コードを回避できる可能性があるため、これはフレームワーク/パターンに依存する部分です)。 .

于 2013-10-07T14:57:05.380 に答える
0

パスワード生成の場合、@Gerald Versluis の回答は、一見の価値があります。

あなたが味を持っているショッピングの場合。フレーバーを「チェック」して、後で「チェックオフ」されたフレーバーの価格を追加しますが、すでに気付いているように、あまりうまくスケールしません。
その場合は、フレーバーをリストに追加して、合計を計算することをお勧めします。

これは、パスワードの生成にも適用できます。さまざまな「パスワード」ジェネレーターを追加することで、スケーリングを大幅に改善し、C# の優れた OOP 機能を使用できます。ここでの流行語は次のとおりです。Polymorhism

于 2013-10-07T15:02:19.017 に答える
0

それらを単純に分割できます。

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

論理的には、この方法とグループ化された方法の間にはありません。

于 2013-10-07T14:57:29.757 に答える