如何使用foreach初始化标签数组中的标签?

时间:2019-01-04 13:16:31

标签: c# .net winforms foreach iteration

我想在表单中创建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:因为它是一个foreach迭代变量,所以无法分配lb。

有解决方案吗?

4 个答案:

答案 0 :(得分:1)

您可以使用@Phils和@rickvdbosch所描述的for循环,但是可以使用Enumerable.Select来保持foreach循环:

//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
}

答案 1 :(得分:0)

您不能将其分配给lb变量,因为它是一个foreach迭代变量,因此它处于只读上下文中。这就是为什么您得到Compiler Error CS1656

  

在只读上下文中发生对变量的赋值时,将发生此错误。只读上下文包括foreach迭代变量,使用变量和固定变量。要解决此错误,请避免在using块,foreach语句和fixed语句中分配给语句变量。

尝试for循环:

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;
}

答案 2 :(得分:0)

您需要使用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;
            }

答案 3 :(得分:0)

您不能在foreach循环中分配值:您还应该在编辑器中看到标记的lb = new Label();,它应该告诉您

  

由于它是“ foreach迭代变量”,因此无法分配给“ lb”

会生成一个Compiler Error CS1656

您可以使用Enumerable.Range一行(除了其他人已经提出的建议)执行此操作:

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

稍有不同,使用枚举的索引向文本添加一个渐进值,并在需要时还为Label分配一个名称(和/或其他值):

var Lb_clubs = Enumerable.Range(0, 32).Select(idx => new Label() { 
    Text = "SomeText" + idx.ToString(), 
    Name = "SomeName" + idx.ToString() }).ToArray();