C# “foreach”如何遍历二维数组?
我对C#中的C# “foreach”如何遍历二维数组?,c#,arrays,for-loop,multidimensional-array,foreach,C#,Arrays,For Loop,Multidimensional Array,Foreach,我对C#中的foreach循环如何迭代多维数组感到好奇。在下面的代码中,第二个嵌套的for循环最初是一个foreach,这将给出放置在循环中的音调的错误位置。我知道凭直觉很难理解它的作用,但基本上是这样的:音高被放入多维数组(这里,numVoices是2,exLength是10),这样你就有了2x10音高数组;然后,MIDI输出设备将同时播放每行音高。当我使用foreach将音高名称放入一个字符串中,以便显示网格中哪个位置的音高时,foreach将以“错误”的顺序显示它们(即,音高网格中的[0,
foreach
循环如何迭代多维数组感到好奇。在下面的代码中,第二个嵌套的for
循环最初是一个foreach
,这将给出放置在循环中的音调的错误位置。我知道凭直觉很难理解它的作用,但基本上是这样的:音高被放入多维数组(这里,numVoices是2,exLength是10),这样你就有了2x10音高数组;然后,MIDI输出设备将同时播放每行音高。当我使用foreach
将音高名称放入一个字符串中,以便显示网格中哪个位置的音高时,foreach
将以“错误”的顺序显示它们(即,音高网格中的[0,3]不是字符串中打印的内容)。对使用嵌套的,此问题消失。我试着用一个较小的例子来重现这个问题,这个例子是int
s(下面的代码)的2D列表,但这次它给出了“正确”的答案。为什么?
//put pitches into grid
//numVoices = 2, exLength = 10 (10 notes long, 2 voices)
for (int i = 0; i < numVoices; i++ )
{
for(int j = 0; j < exLength; j++)
{
//here we generate random pitches in different octaves
//depending on the voice (voice 2 is in octave
//below voice 1, etc)
randnum = (random.Next(100 - (i * 13), 112 - (i * 13)));
melodyGrid[j, i] = (Pitch)randnum;
}
}
for (int i = 0; i < numVoices; i++)
{
for (int j = 0; j < exLength; j++)
{
//this down here makes it more readable for
//humans
//e.g. "FSharp5" becomes "F#5"
noteNames += String.Format("{0, -6}", melodyGrid[j,i].ToString().Replace("Sharp", "#").Replace("Flat", "b"));
}
noteNames += "\r\n"; //lower voices are just separated by newlines
}
Console.WriteLine(noteNames);
有没有可能我只是犯了一个语义错误?或者,foreach
循环是否以不同的方式遍历数组
我很好奇C#中的foreach循环如何在多维数组上迭代
对于这样的问题,最终的权威是C语言规范。在这种情况下,第8.8.4节:
foreach遍历数组元素的顺序如下:对于一维数组,元素以递增的索引顺序遍历,从索引0开始,以索引Length–1
结束。对于多维数组,遍历元素时,首先增加最右边维度的索引,然后增加下一个左边维度的索引,依此类推
现在,将其与使用for
语句进行迭代的方式进行比较:
for (int i = 0; i < numVoices; i++ )
{
for(int j = 0; j < exLength; j++)
{
...
melodyGrid[j, i] = (Pitch)randnum;
for(int i=0;i
换句话说,首先增加最左边的维度…因此,是的,这将给出与foreach
不同的结果。如果要使用foreach
但获得相同的迭代顺序,则需要切换语音和长度的索引。或者,如果要保持相同的索引顺序,只需使用de>for
循环并对其满意
我很好奇C#中的foreach循环如何在多维数组上迭代
像往常一样,对于这样的问题,最终的权威是C语言规范。在这种情况下,第8.8.4节:
foreach遍历数组元素的顺序如下:对于一维数组,元素以递增的索引顺序遍历,从索引0开始,以索引Length–1
结束。对于多维数组,元素的遍历方式是,最右边维度的索引以递增的方式递增第一个维度,然后是下一个左维度,依此类推到左边
现在,将其与使用for
语句进行迭代的方式进行比较:
for (int i = 0; i < numVoices; i++ )
{
for(int j = 0; j < exLength; j++)
{
...
melodyGrid[j, i] = (Pitch)randnum;
for(int i=0;i
换句话说,首先增加最左边的维度…因此,是的,这将给出与foreach
不同的结果。如果要使用foreach
但获得相同的迭代顺序,则需要切换语音和长度的索引。或者,如果要保持相同的索引顺序,只需使用