C# “foreach”如何遍历二维数组?

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,

我对C#中的
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
但获得相同的迭代顺序,则需要切换语音和长度的索引。或者,如果要保持相同的索引顺序,只需使用de>for
循环并对其满意