Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 标签文本值未设置_C# - Fatal编程技术网

C# 标签文本值未设置

C# 标签文本值未设置,c#,C#,我有8个标签。我希望每个标签都将其文本属性设置为随机数。出于某种原因,只有第一个标签有一个数字集,为什么会这样?(另外,尽管没有直接关系,但如果有更好的方法来处理label1.Text、label2.Text、label3.Text等,请让我知道!) 谢谢 public partial class Form1 : Form { public Form1() { InitializeComponent(); go(); } void

我有8个标签。我希望每个标签都将其文本属性设置为随机数。出于某种原因,只有第一个标签有一个数字集,为什么会这样?(另外,尽管没有直接关系,但如果有更好的方法来处理label1.Text、label2.Text、label3.Text等,请让我知道!)

谢谢

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        go();
    }

    void go()
    {
        int[] numbers = new int[8];

        foreach (int number in numbers) 
        {
            numbers[number] = getRandomNumber();
        }

        label1.Text = numbers[0].ToString();
        label2.Text = numbers[1].ToString();
        label3.Text = numbers[2].ToString();
        label4.Text = numbers[3].ToString();
        label5.Text = numbers[4].ToString();
        label6.Text = numbers[5].ToString();
        label7.Text = numbers[6].ToString();
        label8.Text = numbers[7].ToString();
    }

    int getRandomNumber()
    {
        Random random = new Random();
        return random.Next(10, 1000);
    }
}
是因为

int getRandomNumber()
{
    Random random = new Random(); // <-- This line
    return random.Next(10, 1000);
}
int getRandomNumber()
{

Random Random=new Random();//编辑:更多问题

只有第一个标签设置了数字

原因是您以以下方式声明并初始化了
int[]

int[] numbers = new int[8];
在此之后,您有一个长度为
8的数组,但所有整数都是
默认值(int)
什么是0

因此,下面的
foreach
循环

foreach (int number in numbers) 
{
    numbers[number] = getRandomNumber();
}
…将只将第一个
int
初始化为随机数(好吧,不是真正的随机数,稍后将详细介绍)。您可以使用
for
-循环:

for (int iii=0; iii<numbers.Length;iii++)
{ 
    numbers[iii] = getRandomNumber();
}
根据您的第二个问题,如何改进代码:您可以使用带有标签的数组:

Random random = new Random();
var labels = new[] { label1, label2, label3, label4, label5, label6, label7, label8 };
for (int i = 0; i < labels.Length; i++)
{
    labels[i].Text = random.Next(10, 1000).ToString();
}
Random Random=new Random();
var标签=新[]{label1,label2,label3,label4,label5,label6,label7,label8};
for(int i=0;i
问题出在您的
foreach
循环中。您正在使用
number
作为索引,而实际上它是数组中索引处的值。结果是只有第一个
标签。Text
将有一个值!而且,由于您每次都创建一个新的
Random
,因此,
Random。Next
将返回same值,因为随机种子基于时间。请改为尝试以下操作:

private static readonly Random random = new Random(); // <-- only set once

int getRandomNumber()
{
    return random.Next(10, 1000);
}
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        go();
    }

    void go()
    {
        int[] numbers = new int[8];

        Random random = new Random();

        for (int i = 0; i < 8; i++)
        {
            numbers[i] = random.Next(10, 1000);
        }

        label1.Text = numbers[0].ToString();
        label2.Text = numbers[1].ToString();
        label3.Text = numbers[2].ToString();
        label4.Text = numbers[3].ToString();
        label5.Text = numbers[4].ToString();
        label6.Text = numbers[5].ToString();
        label7.Text = numbers[6].ToString();
        label8.Text = numbers[7].ToString();
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
go();
}
void go()
{
整数[]个数=新整数[8];
随机=新随机();
对于(int i=0;i<8;i++)
{
数字[i]=random.Next(101000);
}
label1.Text=数字[0]。ToString();
label2.Text=数字[1]。ToString();
label3.Text=数字[2]。ToString();
label4.Text=数字[3]。ToString();
label5.Text=数字[4].ToString();
label6.Text=数字[5].ToString();
label7.Text=数字[6]。ToString();
label8.Text=数字[7].ToString();
}
}

正如ShadowCat7所指出的,这里的核心问题不是
Random
被误用,而是
foreach
循环被误用

下面是代码行

int[] numbers = new int[8];
声明一个包含8个
int
的数组,所有值均为
0

因此,当您执行以下
foreach
循环时

foreach (int number in numbers) 
{
    numbers[number] = getRandomNumber();
}
您正在遍历名为
numbers
的整数数组中包含的每个
int
值,如前所述,这些值都是
0
!因此,当您将其用作数组索引运算符[]中的参数时,您重复进行此调用

numbers[0] = getRandomNumber();
这就是为什么没有看到数组的其余部分填充10到1000之间的伪随机数的真正原因

虽然不断创建
Random
的新实例确实会通过重用相同的种子一次又一次地为您生成相同的数字(与在这样的循环中使用
Random
的目的背道而驰),这里的主要问题是为什么8个标签中有7个是
0
,这是因为滥用了
foreach
循环


关于为每个
标签设置
文本
值的巧妙方法,请参见Tim Schmelter的答案,因为它非常出色。

在函数外部设置随机静态。您的问题是,为所有8个标签生成相同的数字?或者只有第一个标签显示一个值,而所有其他7个标签显示一个值不显示任何数字?@AustinSalonen这不是重复的。正如在答案中发现的,随机对象不是问题的全部原因。所有其他标签仍然被分配为0,这是foreach循环的主要问题。谢谢你的回答!作为一个新手,你介意我问一下为什么使用“var”数据类型吗?这是什么样的隐式声明?如果标签是一个对象,那么创建一个对象数组不是更好吗?@JoelKidd:不是一个真正的数据类型。它是实际类型的替代品。因此它仍然是强类型的(与
动态
),但比
标签[]短
。因此,如果类型是明显的,因为我进行赋值,我使用
var
,只是为了防止水平滚动,不要重复我自己。如果类型不明显,我不使用
var
,而是使用实际的类型,因为可读性比简洁性更重要。然而,在这种情况下,最好使用
Label[]
;-)非常感谢您的详细解释。我通常会编写JavaScript,这样您就可以理解其中的困惑,所有强类型的内容对我来说都是全新的,所以我想我最好问一下:P@Tim问题不在于标签文本不是随机的。他还没有做到这一点。除了空白之外,他没有得到任何文本。在您的第一个解决方案中,
numbers[number]
是导致他遇到问题的原因。@ShadowCat7+Derek:您说得对。谢谢您的提示。我已相应地编辑了我的答案。
numbers[0] = getRandomNumber();