每次循环执行C#时更改方法调用

时间:2012-11-23 08:06:56

标签: c# loops methods for-loop

好的,我想打电话给

for (int i = 0; i < b; b--)
{
    color += ChooseColor() + " ";
}

重要的是它被多次调用。我的ChooseColors()是

private static string ChooseColor()
{
    Random random = new Random();
    var colors = new List<string> { "Blue", "Red", "Green", "Indigo", "Black", "White", "Violet", "Turquoise", "Pink", "Lavender", "Cinder", "Fuschia", "Orange" };
    int index = random.Next(colors.Count);
    string colorName = colors[index];
    colors.RemoveAt(index);
    return colorName;
}

问题是,我希望它每次都调用一个新的ChooseColor实例。例如,它会打印黑色白色而不是黑色黑色。现在它反复打印完全相同的东西,而不是转储当前和再次调用(这是我认为循环做的&gt;。&lt;)任何建议?

3 个答案:

答案 0 :(得分:2)

数组在方法中声明,因此当您再次调用该方法时,它会重新声明并重新填充。您必须在方法之外静态声明颜色列表。

此外,随机化器在每次方法调用时再次初始化 - 也只是在方法之外初始化一次随机化器。

private static Random random = new Random();
private static List<string> colors = new List<string> { ... };

private static string ChooseColor()
{
    if (colors.Count > 0)
    {
        int index = random.Next(colors.Count);
        string colorName = colors[index];
        colors.RemoveAt(index);
        return colorName;
    }

    return String.Empty;
}

请注意,此方法在调用时返回一个空字符串,颜色列表中没有剩余颜色。我认为除了修复随机发生器问题之外,你应该重新考虑设计(特别是为什么必须从列表中删除颜色)。

答案 1 :(得分:1)

在这种情况下,创建Random class static的实例。

这样

static Random random = new Random(); // Global Declaration

private static string ChooseColor()
{
    var colors = new List<string> { "Blue", "Red", "Green", "Indigo", "Black", "White", "Violet", "Turquoise", "Pink", "Lavender", "Cinder", "Fuschia", "Orange" };
    int index = random.Next(colors.Count);
    string colorName = colors[index];
    colors.RemoveAt(index);
    return colorName;
}

欲了解更多信息,请阅读

Generated random numbers are always equal

答案 2 :(得分:1)

您创建Random个实例的时间太近了。由于它们是从时钟播种的,它们都将以相同的数字开始。在函数外部创建一个实例,并将其发送给您调用它。

此外,您每次都在创建一个新列表,因此从列表中删除项目无效。在函数外部创建列表:

Random random = new Random();
List<string> colors = new List<string> { "Blue", "Red", "Green", "Indigo", "Black", "White", "Violet", "Turquoise", "Pink", "Lavender", "Cinder", "Fuschia", "Orange" };
for (int i = 0; i < b; b--) {
  color += ChooseColor(colors, random) + " ";
}

private static string ChooseColor(List<string> colors, Random random) {
  int index = random.Next(colors.Count);
  string colorName = colors[index];
  colors.RemoveAt(index);
  return colorName;
}