这是我的场景:为了在一个范围内随机分配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
但是我无法理解,而且我越是检查出来,我得到的怪物。
提前致谢,希望你有所需的东西(请告诉我)。
马里奥。
答案 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先生的大力支持和快速回答。