Windows Phone:从列表中生成随机数会抛出“参数超出范围异常”

时间:2011-12-21 00:00:37

标签: windows-phone-7 exception random parameters

这是我的场景:为了在一个范围内随机分配DISTINCT随机数,我创建了一个从0到9的列表,以及一个按钮数组,如:

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);
            }
        }

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

有什么想法吗?我在Android下尝试了相同的代码并通过调整一些东西(除了 Size()而不是 Count()删除完美地工作而不是 RemoveAt 等;除此之外,代码保持完全相同)。我已尝试在每一行调试和停止,它在行

处提供该错误
myNumber = "" + draft[num];

//error: ArgumentOutOfRangeException not found. parameter name: index

但是我无法理解,而且我越是检查出来,我得到的怪物。

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

马里奥。

2 个答案:

答案 0 :(得分:2)

您的意思是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);
        }

Edit2:使用myButton.Visibility = System.Windows.Visibility.Hidden;代替myButton.Opacity = 0;

答案 1 :(得分:0)

为了保持清洁并向别人展示,Tomislav的回答让我走上正轨。

错误来自IF行检查可见性而不是不透明度。由于我需要将该空间保持为“占用”(不可见但仍然存在,例如Android的INVISIBLE而不是GONE可见性属性),我已经改变了这条线,现在效果很好:

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先生的大力支持和快速回答。

相关问题