операция со значением не работает (операция> массив> контроль) - PullRequest
0 голосов
/ 05 февраля 2020
int[] subject = { 0, Maths, English, Construction, IT };  

int t = 1;
int c = 0;

while (t < 4)
{
    if (Convert.ToInt32(Chart[c].Text) != 0)
    {
        if (c < 12)
        {
            c++;
        }                       
        Counter();
    }
    else
    {
        int m = random.Next(1, 4);
        Chart[c].Text = Convert.ToString(m);
        subject[m]--; // this isnt working!!
        Chart[c].Refresh();
        tbTotal--;
    }
}
   private void Counter()
    {
        if(Maths == 0 && math == false)
        {
            math = true;
            t++;
        }
        if (English == 0 && english == false)
        {
            english = true;
            t++;
        }
        if(IT == 0 && it == false)
        {
            it = true;
            t++;
        }
        if(Construction == 0 && construction == false)
        {
            construction = true;
            t++;
        }

переменная "m" не вычитается, чтобы разрешить экранирование while l oop и ограничить добавление значений в текстовые поля.

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

Это создает бесконечное время, пока l oop и останавливается.

1 Ответ

0 голосов
/ 06 февраля 2020

Кажется, вы ожидаете, что эта строка:

subject[m]--; // this isnt working!!

изменит исходные переменные Math, English, Construction и IT, использованные для инициализации массива, чтобы позже у вас будут отличаться результаты от условных блоков if() в методе Counter(), которые смотрят на эти переменные.

Этого не произойдет. Элементы в массиве subject являются просто значениями . После присвоения массиву связь с переменными больше не существует.

Вы можете увидеть, как он воспроизводится с этим примером кода:

int foo = 1;
int[] bar = {foo};

Console.WriteLine(bar[0]); // 1 -- initialing the value worked

bar[0] = 2;
Console.WriteLine(foo); // still 1 -- changing the array doesn't change the variable

foo = 3; 
Console.WriteLine(bar[0]); // still 2 -- changing the variable doesn't change the array

Это может быть отличается, если целые числа, где свойства объектов, где у вас были ссылки на один и тот же объект. Тогда изменение свойства приведет к изменению обеих переменных, поскольку они ссылаются на один и тот же объект. Но простые типы значений, такие как integer, не работают таким образом.

Вместо этого я мог бы определить свой массив следующим образом:

const int MATH = 0;
const int ENGLISH = 1;
const int CONSTRUCTION = 2;
const int IT = 3;

int[] subjects = new int[4];

А теперь всегда ссылаются на значения используя шаблон, подобный следующему:

subjects[MATH] = ...;

Или вы можете определить тип класса следующим образом:

public class Subject
{
    public int Value {get;set;} = 0;
    public bool Dirty {get;set;} = false;
}

Тогда ваш код может измениться на использование нового класса, такого как:

//change old variables to use the new type
var Maths = new Subject();
var English = new Subject();
var Construction = new Subject();
var IT = new Subject();

Subject[] subjects = {null, Maths, English, Construction, IT};

int t = 1;
int c = 0;

while (t < 4)
{
    if (Convert.ToInt32(Chart[c].Text) != 0)
    {
        if (c < 12)
        {
            c++;
        }                       
        Counter();
    }
    else
    {
        int m = random.Next(1, 4);
        Chart[c].Text = Convert.ToString(m);
        subject[m].Value--; 
        Chart[c].Refresh();
        tbTotal--;
    }
}

private void Counter()
{
    if(Maths.Value == 0 && !Maths.Dirty)
    {
        Maths.Dirty = true;
        t++;
    }
    if (English.Value == 0 && !English.Dirty)
    {
        English.Dirty = true;
        t++;
    }
    if(IT.Value == 0 && !IT.Dirty)
    {
        IT.Dirty = true;
        t++;
    }
    if(Construction.Value == 0 && !Construction.Dirty)
    {
        Construction.Dirty = true;
        t++;
    }
}

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

var Maths = new Subject();
var English = new Subject();
var Construction = new Subject();
var IT = new Subject();

Subject[] subjects = {null, Maths, English, Construction, IT};

int t = 1;
int c = 0;

while (t < 4)
{
    if (Convert.ToInt32(Chart[c].Text) != 0)
    {
        if (c < 12)
        {
            c++;
        }                       
        Counter(subjects);
    }
    else
    {
        int m = random.Next(1, 4);
        Chart[c].Text = Convert.ToString(m);
        subject[m].Value--; 
        Chart[c].Refresh();
        tbTotal--;
    }
}

private void Counter(IEnumerable<Subject> subjects)
{
    foreach(var s in subjects.Where(s => s is object))
    {
       if (s.Value == 0 && !s.Dirty)
       {
           s.Dirty = true;
           t++;
       {
    }
}
...