Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何循环数组C#_C#_Arrays_Loops - Fatal编程技术网

如何循环数组C#

如何循环数组C#,c#,arrays,loops,C#,Arrays,Loops,我试图在消息框中显示以下密码。我想做的是通过消息框给用户第一个密码,即111111。在给出111111之后,用户下次请求另一个密码时,它将是2222222,依此类推。如果所有密码都用完了,循环将简单地返回到111111、222222、333333等。。。我该怎么做?谢谢你的帮助 这是我的密码: int[] password; password = new int[10]; pa

我试图在消息框中显示以下密码。我想做的是通过消息框给用户第一个密码,即111111。在给出111111之后,用户下次请求另一个密码时,它将是2222222,依此类推。如果所有密码都用完了,循环将简单地返回到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;

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

两种选择:

  • 保留密码列表,并在其中保留“当前索引”。每次递增索引,到达末尾时循环回0

  • 改用
    队列
    ,无论何时显示密码,都要在末尾添加一个新密码

旁白:

  • int
    是一种非常糟糕的密码类型,除非你真的把用户限制在数字键盘上。即使这样,您也应该真正区分“0001”和“1”,这是
    int
    值无法区分的

  • 学习使用数组初始值设定项。示例代码的大部分相当于:

    int[] password = { 0, 111111, 222222, 333333, 444444, 555555, 666666,
                       777777, 888888, 999999 };
    
  • 重复使用的硬编码密码列表。。。真的吗


您可以使用迭代器方法,该方法基本上会在每次调用下一个密码时返回密码,并在密码列表上循环(在列出所有密码后从第一个密码开始)

多次,您每次都会在消息框中获得下一个密码,如果达到999999,则返回000000

编辑:迭代器的使用是错误的(参见下面的John Skeet评论) 如果保持完全相同的迭代器块,其中一种方法是通过调用
GetPassword().GetEnumerator()
,然后将枚举器提供给另一个实际返回密码的方法GetNextPassword来获取枚举器(每个用户一次,或所有用户相同,具体取决于用法)

int GetNextPassword(IEnumerator<int> enumerator)
{ 
    enumerator.MoveNext();
    return enumerator.Current;
}
int GetNextPassword(IEnumerator枚举器)
{ 
枚举数。MoveNext();
返回枚举数.Current;
}

但是现在还不是很漂亮。

对于您的特定场景,我建议使用:


只需将
count
变量初始化为1,这样用户第一次请求时就可以显示密码[count],依此类推,然后只需检查count是否为
=
数组长度。不,不会。对单个调用
GetPassword()
返回的值调用
MoveNext()
/
Current
将返回下一个密码。这是一个很大的区别-您需要调用此方法一次并隐藏返回值。+1“一个重复使用的硬编码密码列表…真的吗?”@CantHandleMeBabe是的,实际上不要使用
while
循环。我只是想向您展示
出列
的行为。@CantHandleMeBabe取决于具体情况。用户如何要求另一个密码?顺便说一句,你读了乔恩·斯基特答案中的旁白了吗?我不知道你是真的在这样做,还是只是编了个例子。我在这样做,用户会按一个按钮获取密码,比如111111。如果他再次按下该按钮,消息框将显示2222222,依此类推。@CantHandleMeBabe在按钮的方法中单击put
MessageBox.Show(“您的密码是”+passwords.Dequeue();
。密码始终是111111…我放置了
MessageBox.Show(“您的密码是”+passwords.Dequeue());
在foreach循环之外。
MessageBox.Show(String.Format("Your password is {0}", GetPassword());
int GetNextPassword(IEnumerator<int> enumerator)
{ 
    enumerator.MoveNext();
    return enumerator.Current;
}
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();
}