Это мой сценарий: чтобы сделать случайное назначение случайных чисел 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);
}
}
Это будет «работать» (будет перетасовываться, но только на первых 5 кнопках, а не на всех из них по мере необходимости) до тех пор, пока я нажимаю любую кнопку до«04» в этом случае (при нажатии «05» возникнет исключение);если я изменю его на любое другое число, оно будет «работать» до достижения установленного предела.
Есть идеи?Я попробовал тот же код под Android и отлично работает, настраивая некоторые вещи (ничего кроме Size () вместо Count () , Remove вместо RemoveAt и т. Д .; кроме того, код остается полностью прежним).Я пытался отлаживать и останавливаться в каждой строке, она выдает эту ошибку в строке
myNumber = "" + draft[num];
//error: ArgumentOutOfRangeException not found. parameter name: index
, но я не могу понять это, и чем больше я проверяю, тем страннее я получаю.
Заранее спасибо, надеюсь, у вас есть все необходимое (скажите, пожалуйста, иначе).
Марио.