Кажется, вы ожидаете, что эта строка:
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++;
{
}
}