Windows Phone:从列表生成随机数抛出"Argument Out Of Range Exception"



这是我的场景:为了在一个范围内对DISTINCT随机数进行随机分配,我创建了一个从0到9的列表和一个button数组,如:

for (int i = 0; i < numbers2BeDrawn; i++)
{
    draft.Add(i);
}
for (int i = 0; i < numbers2BeDrawn; i++)
{
    num = rnd.Next(draft.Count());
    myNumber = "" + i;
    if (myNumber.Length < 2) myNumber = "0" + myNumber;
    buttonList[draft[num]].Content = myNumber;
    draft.RemoveAt(num);
 }

这样,我确保每个按钮都有一个从0到9的数字,没有重复。到目前为止一切都好……

现在,每次我按下一个按钮,从0开始到9,我想让它消失,把它的数字从草稿列表中删除,其余的重新洗牌并再次分布在剩余的活动按钮中,代码是:

private void btn_Click(object sender, RoutedEventArgs e)
{
        //write a common procedure for all buttons 
        var myButton = sender as Button;
        if(myButton != null) 
        {
            var buttonTag = myButton.Content;
            btnText = buttonTag.ToString();
        }
        myNum = "" + currentNum;
    if (myNum.Length < 2) myNum = "0" + myNum;
        if (myNum.Equals(btnText))
        {
            myButton.Opacity = 0;
            currentNum++;
            DrawNumbers();
        }
}
private void DrawNumbers()
{
        //clear the list and create it again with the numbers left
        draft.Clear();
        for (int i = numbers2BeDrawn; i > currentNum; i--)
        {
            draft.Add(i - 1);
        }
        //now, distribute them among the VISIBLE BUTTONS ONLY
        for (int i = 0; i < numbers2BeDrawn; i++)
        {
            if (buttonList[i].Visibility == Visibility.Visible)
            {
                num = rnd.Next(draft.Count());
                myNumber = "" + draft[num];
                if (myNumber.Length < 2) myNumber = "0" + myNumber;
                buttonList[i].Content = myNumber;
                draft.RemoveAt(num);
            }
        }
    }

问题是,当我点击任何按钮时,它抛出一个"参数超出范围异常"。如果我这样做,它将工作:

        //substitution on the 'for' statement
        for (int i = 0; i < 5; i++)
        {
            if (buttonList[i].Visibility == Visibility.Visible)
            {
                num = rnd.Next(draft.Count());
                myNumber = "" + draft[num];
                if (myNumber.Length < 2) myNumber = "0" + myNumber;
                buttonList[i].Content = myNumber;
                draft.RemoveAt(num);
            }
        }

这将'工作'(将洗牌,但只在前5个按钮,而不是所有的需要),只要我点击任何按钮到'04'在这种情况下(将抛出异常点击'05');如果我将其更改为任何其他数字,它将"工作",直到达到规定的限制。

任何想法?我在Android下尝试过同样的代码,并且通过调整一些东西(除了Size()而不是Count()Remove而不是RemoveAt等等)可以完美地工作;除此之外,代码完全保持不变)。我试着在每一行中调试和停止,它在

行提供了错误
myNumber = "" + draft[num];
//error: ArgumentOutOfRangeException not found. parameter name: index

但是我不明白,我越看越觉得奇怪。

提前感谢,希望你有所有需要的东西(请告诉我,否则)。

马里奥。

您是指myNumber = "" + draft[i];吗?这也会把你的draft.RemoveAt(num);变成draft.RemoveAt(i);

编辑:

我正在我的机器上运行这段代码,它没有错误地完成。最后,草案没有任何内容。告诉我这和你的场景有什么不同?

        Collection<int> draft = new Collection<int>();
        int numbers2BeDrawn = 100; int num; string myNumber; Random rnd = new Random();
        for (int i = 0; i < numbers2BeDrawn; i++)
        {
            draft.Add(i);
        }
        for (int i = 0; i < numbers2BeDrawn; i++)
        {
            num = rnd.Next(draft.Count());
            myNumber = "" + i;
            if (myNumber.Length < 2) myNumber = "0" + myNumber;
            //buttonList[draft[num]].Content = myNumber;
            draft.RemoveAt(num);
        }

编辑2:用myButton.Visibility = System.Windows.Visibility.Hidden;代替myButton.Opacity = 0;

为了保持整洁并向其他人展示,Tomislav的回答让我走上了正确的道路。

错误来自IF行检查可见性而不是不透明度。因为我需要将该空间保持为"占用"(不可见但仍然存在,就像Android的INVISIBLE而不是GONE visibility属性),我已经改变了行,现在工作得很好:

for (int i = 0; i < numbers2BeDrawn; i++)
        {
            //if (buttonList[i].Visibility == Visibility.Visible)
            if (buttonList[i].Opacity > 0)
            {
                int num = rnd.Next(draft.Count());
                myNumber = "" + draft[num];
                if (myNumber.Length < 2) myNumber = "0" + myNumber;
                buttonList[i].Content = myNumber;
                draft.RemoveAt(num);
            }
        }

再次感谢Markovski先生的大力支持和快速答复。

相关内容

最新更新