洗牌字符串数组每个只使用一次

Shuffling string array only use each one once

我有一个字符串数组,它将被放入一个按钮的文本中,它正在正确地打乱数组,但是当涉及到将文本放入按钮内部时,它会将它们全部替换为相同的值并且无法知道该值是否已被使用,我猜这是由于循环处于错误的位置或类似的性质。

protected void Page_Load(object sender, EventArgs e)
{

    string[] arr = new string[]
    {
        "0","1","2","3","4","5","6","7","8","9"
    };
    //shuffle code

    string[] shuffle = RandomStringArrayTool.RandomizeStrings(arr);
    foreach (string s in shuffle)
    {   
        foreach (var item in panel1.Controls)
        {
            if (item is Button)
            {  
                ((Button)item).Text = s.ToString();
            }
        }
    }


}

是的,您调用了 foreach 两次!它对 shuffle 的所有字符串执行第二个 foreach,因此以所有以 shuffle[9]

的值命名的按钮结束

将其更改为:

int i=0;
foreach (var item in panel1.Controls)
{
    if (item is Button)
    {  
        ((Button)item).Text = shuffle[i];
        i++;
    }
}

编辑

您可以摆脱 RandomStringArrayTool 的东西,并实现自己的东西,这是开始的简单方法:

string str = "0123456789";
bool[] used = new bool[10];
Random r = new Random();

foreach (var item in shuffle_gbx.Controls)
{
    // keep looking for unused index
    int i = r.Next(0,10);
    while (used[i])
    {
       i = r.Next(0, 10);
    }

    ((Button)item).Text = str[i].ToString();
    used[i] = true;
 }