0

I'm trying to display the following passwords in a message box. What I want to happen is to give to the user the first password, which is 111111, by means of message box. After 111111 has been given, the next time the user asks for another password, it will be 222222, and so on and so forth. If all the passwords have been used up, the loop will simply return to 111111, 222222, 333333, etc... How do I do it? Thanks for any help.

Here's my code:

                    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

听起来您并没有真正在这里循环-您只是想维护一个索引。毕竟,“为用户提供密码”听起来像是事件驱动的,而不是我们的代码重复的。

两种选择:

  • 保留密码列表,并将“当前索引”保留在其中。每次增加索引,到达终点时循环回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。

编辑:迭代器的使用是错误的(参见下面的 John Skeet 评论)如果保持完全相同的迭代器块,一种方法是通过调用获取枚举器(每个用户一次或所有用户相同,取决​​于使用情况)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 回答