0

メッセージ ボックスに次のパスワードを表示しようとしています。私がやりたいことは、メッセージ ボックスを使用して、111111 である最初のパスワードをユーザーに与えることです。111111 が与えられた後、次にユーザーが別のパスワードを要求したときに、それは 222222 になり、以下同様です。すべてのパスワードが使い果たされた場合、ループは単純に 111111、222222、333333 などに戻ります... どうすればよいですか? 助けてくれてありがとう。

これが私のコードです:

                    int[] password;
                    password = new int[10];
                    password[0] = 000000;
                    password[1] = 111111;
                    password[2] = 222222;
                    password[3] = 333333;
                    password[4] = 444444;
                    password[5] = 555555;
                    password[6] = 666666;
                    password[7] = 777777;
                    password[8] = 888888;
                    password[9] = 999999;

                    MessageBox.Show("Your password is ...");
                    return;
4

3 に答える 3

7

ここで実際にループしているようには見えません-インデックスを維持したいだけです。結局のところ、「ユーザーにパスワードを提供する」というのは、単にコードによって繰り返されるのではなく、イベント駆動型のように聞こえます。

2 つのオプション:

  • パスワードのリストを保持し、「現在のインデックス」を保持します。毎回インデックスをインクリメントし、最後に到達したら 0 にループバックします。

  • 代わりにaを使用しQueue<T>、パスワードを表示するたびに、最後に新しいパスワードを追加します。

余談ですが:

  • intユーザーを数字キーパッドに本当に制限していない限り、パスワードに選択するのは本当に悪いタイプです。それでも、「0001」と「1」を実際に区別する必要がありますが、これらのint値は区別できません。

  • 配列初期化子の使用方法を学びます。サンプル コードの大部分は次と同等です。

    int[] password = { 0, 111111, 222222, 333333, 444444, 555555, 666666,
                       777777, 888888, 999999 };
    
  • 再利用されるパスワードのハードコーディングされたリスト...本当に?

于 2012-07-21T07:07:20.843 に答える
2

基本的に、呼び出されるたびに次のパスワードを返し、パスワードリストをループする反復子メソッドを使用できます(すべてのパスワードがリストされたときに最初のパスワードから開始するため)

IEnumerable<int> GetPassword()
{
    while (true)
    {
       yield return 000000;
       yield return 111111;
       yield return 222222;
       yield return 333333;
       yield return 444444;
       yield return 555555;
       yield return 666666;
       yield return 777777;
       yield return 888888;
       yield return 999999;
    }
}

このメソッドを呼び出すたびに、次のパスワードが返されます

だから電話したら

MessageBox.Show(String.Format("Your password is {0}", GetPassword());

複数回、メッセージ ボックスに毎回次のパスワードが表示され、一度 999999 に達すると 000000 に戻ります。

EDIT : イテレータの使用法が間違っています (以下の John Skeet のコメントを参照) まったく同じイテレータ ブロックを維持する場合の方法の 1 つは、列挙子を取得することです (使用法に応じて、ユーザーごとに 1 回またはすべてのユーザーで同じ)。GetPassword().GetEnumerator()次に、実際にパスワードを返す別のメソッド GetNextPassword に列挙子を提供します。

int GetNextPassword(IEnumerator<int> enumerator)
{ 
    enumerator.MoveNext();
    return enumerator.Current;
}

しかし、この時点ではあまりきれいになりません。

于 2012-07-21T07:09:54.517 に答える
0

特定のシナリオでは、Queueを使用することをお勧めします。

using System.Collections;

Queue passwords = new Queue();

foreach (int p in new int[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 })
{
   passwords.Enqueue(p);
}

//just to show you that it's FIFO (first-in, first-out)
while (passwords.Count > 0)
{
   MessageBox.Show("Your password is " + passwords.Dequeue();
}   
于 2012-07-21T07:16:10.100 に答える