这是我的场景:为了在一个范围内对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先生的大力支持和快速答复。