Windows Phone: генерация случайных чисел из списка выдает «Аргумент вне диапазона исключений» - PullRequest
1 голос
/ 21 декабря 2011

Это мой сценарий: чтобы сделать случайное назначение случайных чисел 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

, но я не могу понять это, и чем больше я проверяю, тем страннее я получаю.

Заранее спасибо, надеюсь, у вас есть все необходимое (скажите, пожалуйста, иначе).

Марио.

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Вы имеете в виду 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;

0 голосов
/ 21 декабря 2011

Просто чтобы держать его в чистоте и показывать другим, ответ Томислава заставил меня пойти по правильному пути.

Ошибка возникает из-за того, что строка 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);
            }
        }

Еще раз, большое спасибо господину Марковски за отличную поддержку и быстрые ответы.

...