【问题标题】:Array is not initializing correctly in foreach loop数组未在 foreach 循环中正确初始化
【发布时间】:2014-12-09 16:00:55
【问题描述】:

所以我正在尝试制作一个随机数生成器:

private static void init() 
{
    int[] integ = new int[10];

    Random random = new Random();

    // init
    foreach (int integer in integ)
    {
        integ[integer] = rand.Next(5,35);
    }


    foreach (int b in integ)
    {
        Console.WriteLine("Byte = " + b);
    }
}

static void Main(string[] args)
{
    init();

    Console.ReadKey();
}

但由于某种原因,当我运行它时,它会打印:

Byte = (*random number here*)
Byte = 0
Byte = 0
etc...

我多次运行它以确保每次只有第一个具有非零数字。

任何建议将不胜感激,在此先感谢。

【问题讨论】:

  • 你已经用Length 10 初始化了一个数组,但所有的默认值都是int 的0。所以你总是覆盖第一个int(integ[0])。您想使用for-loop 来初始化数组中的所有值。
  • foreach (int integer in integ) 产生 10 次 0。使用 for 循环。
  • @Mechanic45: 不,这是一个foreach,它总是产生0,因为数组只包含零,因此总是覆盖索引0:integ[0] = rand.Next(5,35)
  • @Mechanic45 foreach 循环遍历integinteger 的值是数组中每个元素的值,而不是索引。由于 integ 初始化为 0 数组,因此 integ[integer] 始终为 integ[0]
  • @Mechanic45:仅当您使用在循环中增加的附加计数器变量时。但是你真的应该使用 for 循环,因为它是专门为此目的而设计的。

标签: c# random generator


【解决方案1】:

让我们看看这是做什么的:

foreach (int integer in integ)
{
    integ[integer] = rand.Next(5,35);
}

基本上,foreach 循环遍历integ(最初都是0)的,并将integ 中该索引处的值设置为随机数.所以它只会填充数组中的第一项。

要初始化数组,请改用for 循环:

for (int i = 0; i < integ.Length; i++)
{
    integ[i] = rand.Next(5,35);
}

或者,如果您对 Linq 有点熟悉:

Random random = new Random();
int[] integ = Enumerable.Repeat(0, 10)
                        .Select(i => random.Next(5, 35))
                        .ToArray();

正如 Blindy 指出的那样,如果您只想打印值,那么您甚至不需要数组:

Random random = new Random();
for (int i = 0; i < 10; i++)
{
    Console.WriteLine("Byte = {0}", rand.Next(5,35));
}

【讨论】:

  • 如果你对这个可枚举对象所做的只是打印出来,甚至不需要数组。
  • @Blindy 是的,但我认为 OP 计划在此之后编写更多代码来使用这个数组。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多