C#WinForm Enum ToString

时间:2016-02-25 21:42:16

标签: c# winforms enums

//一般来说,我从Enum中获取随机颜色并将其插入到新数组中。 当我在循环中通过BoxMessage询问时对于每个Array [i]我得到了预期的随机颜色。 如果我评论(\)消息框并在循环外询问数组[1-5],我得到所有5个消息框的相同颜色。 我相信这与我在循环中的消息框成功将Enum转换为字符串这一事实有关,当我试图在循环中转换整个数组时(array [i] .ToString();)它没有完全奏效。 请指教....

    public void GetArray()
    {


        array = new EnumColor[5];
        for (int i = 0; i < 5; i++)
        {
            rnd = new Random();
            int rndnum = rnd.Next(0, 4);
            array[i] = (EnumColor)rndnum;

            MessageBox.Show(array[i].ToString());


        }
        MessageBox.Show(array[0].ToString());
        MessageBox.Show(array[1].ToString());
        MessageBox.Show(array[2].ToString());
        MessageBox.Show(array[3].ToString());
        MessageBox.Show(array[4].ToString());


    }

3 个答案:

答案 0 :(得分:1)

您获得相同的颜色,因为您每次在循环中声明random实例,只需将声明移到外面:

rnd = new Random();
for (int i = 0; i < 5; i++)
{ ... }

如果您想详细了解Random课程为何如此有效,您可以查看this answer

答案 1 :(得分:1)

 for (int i = 0; i < 5; i++)
    {
        rnd = new Random();
        int rndnum = rnd.Next(0, 4);
        array[i] = (EnumColor)rndnum;

        MessageBox.Show(array[i].ToString());


    }

你要覆盖数组中的元素,不要这样做。

将元素转换为临时局部变量(并使用.Length而不是硬编码长度)

错误本身是由于Random被错误播种引起的,它在每次迭代时都被重新生成。

Random rnd = new Random();

for (int i = 0; i < array.Length; i++)
{
    int rndnum = rnd.Next(0, 4);
    EnumColor selected = (EnumColor)array[i];

    MessageBox.Show( selected .ToString() );
}

答案 2 :(得分:0)

问题确实是为每个循环重新创建Random。但是这里有完整的解释。

创建Random时,它使用Environment.TickCount作为种子值。 (自系统启动以来的毫秒数)。因此,如果你的循环足够快,它将始终是相同的值,因此rnd.Next函数将始终返回相同的值。

所以现在对于棘手的部分..为什么它与循环内的消息框一起工作?通过显示消息,等待单击“确定”按钮,循环变慢。因此下一个循环,种子确实改变了。这就是你获得另一个价值的原因。