Как инициализировать метки в массиве меток с помощью foreach? - PullRequest
0 голосов
/ 04 января 2019

Я хочу создать 32 метки в своей форме, поэтому я использовал такой код:

//using System.Windows.Forms;
Label[] Lb_clubs;
Lb_clubs = new Label[32];
foreach(Label lb in Lb_clubs)
{
  lb = new Label();
  lb.Text = "somename";
  //and other codes
}

Но я получаю ошибку

CS1656: Невозможно назначить lb, поскольку это итерационная переменная foreach.

Есть решение?

Ответы [ 4 ]

0 голосов
/ 04 января 2019

Вы не можете присвоить значение в цикле foreach: вы также должны увидеть lb = new Label();, отмеченный в редакторе, который должен сообщить вам, что оно

Невозможно присвоить 'lb', поскольку это 'итерационная переменная foreach'

, который генерирует Ошибка компилятора CS1656 .

Вы можете сделать это (помимо того, что другие уже предложили) в одну строку, используя Enumerable.Range :

var Lb_clubs = Enumerable.Range(0, 32).Select(l => new Label() { Text = "SomeText" }).ToArray();

Немного отличается, добавляя прогрессивное значение к тексту, используя индекс перечисления, а также присваивает Имя (и / или другие значения) метке, если необходимо:

var Lb_clubs = Enumerable.Range(0, 32).Select(idx => new Label() { 
    Text = "SomeText" + idx.ToString(), 
    Name = "SomeName" + idx.ToString() }).ToArray();
0 голосов
/ 04 января 2019

Вам нужно использовать цикл for, а не foreach

            Label[] Lb_clubs;
            Lb_clubs = new Label[32];

            for (int i = 0; i < 32; i++)
            {
                var lb = new Label();
                lb.Text = "somename";
                //and other codes
                Lb_clubs[i] = lb;
            }
0 голосов
/ 04 января 2019

Вы можете использовать цикл for, как описано в @Phils и @rickvdbosch, но вы можете сохранить цикл foreach, используя Enumerable.Select:

//using System.Windows.Forms;
Label[] Lb_clubs;
Lb_clubs = new Label[32].Select(lbl => new Label()).ToArray();
foreach (Label lb in Lb_clubs)
{
    lb.Text = "somename";
    //and other codes
}
0 голосов
/ 04 января 2019

Нельзя назначить переменную lb, потому что это переменная foreach, поэтому она доступна только для чтения. Вот почему вы получаете Ошибка компилятора CS1656 :

Эта ошибка возникает, когда присваивание переменной происходит в контексте только для чтения. Контексты только для чтения включают итерационные переменные foreach, использование переменных и фиксированные переменные. Чтобы устранить эту ошибку, избегайте присвоений переменной оператора в using блоках, foreach операторах и fixed операторах.

Попробуйте for -loop:

Label[] Lb_clubs;
Lb_clubs = new Label[32];
for (int i = 0; i < 32; i++)
{
    var lb = new Label();
    lb.Text = "somename";
    //and other codes
    Lb_clubs[i] = lb;
}
...