C# 有可能防止foreach展平矩形阵列吗?

C# 有可能防止foreach展平矩形阵列吗?,c#,C#,我注意到,vari in x将数组展平,因此它为第二个foreach生成以下错误 错误1 foreach语句无法对“int”类型的变量进行操作 因为“int”不包含“GetEnumerator”的公共定义 有没有可能阻止foreach展平矩形数组?如果你有一个锯齿状数组,它不会以这种方式运行(即数组声明为int[][/code>而不是int[,]),foreach被设计为枚举每个元素,在2D数组中,每个元素都是int,而不是int数组(尽管静态初始值设定项使它看起来像是一个数组数组,但它不是)。

我注意到,
vari in x
将数组展平,因此它为第二个
foreach
生成以下错误

错误1 foreach语句无法对“int”类型的变量进行操作 因为“int”不包含“GetEnumerator”的公共定义


有没有可能阻止
foreach
展平矩形数组?

如果你有一个锯齿状数组,它不会以这种方式运行(即数组声明为
int[][/code>而不是
int[,]
),foreach被设计为枚举每个元素,在2D数组中,每个元素都是int,而不是int数组(尽管静态初始值设定项使它看起来像是一个数组数组,但它不是)。如果您想让它按原样工作(使用2D数组),我建议使用常规的for循环而不是foreach。

如果您有锯齿状数组,它不会以这种方式工作(即声明为
int[][/code>的数组,而不是
int[,]
)Foreach设计用于枚举每个元素,在2D数组中,每个元素都是int,而不是int数组(尽管静态初始值设定项使其看起来像数组数组,但它不是)。如果要使其按原样工作(使用2D数组),我建议使用传统的for循环而不是foreach。

多维数组在某种意义上是一种一维数组,它使用维度信息访问数据,就好像它们确实存储在二维中一样。因此,当通过许多方法访问时(例如,从类
数组
)并且
foreach
iteration它被视为一维数组,因为这是内存中的实际布局。否则在迭代过程中,需要为每一行创建新的一维数组

你可以尝试做以下事情来实现你的目标:

  • 使用交错数组而不是多维数组:
    int[][]
  • 创建扩展方法
    IEnumerable ByRows(此T[,]数组)
    ,该方法将创建对行进行适当迭代的迭代器。显然,行可以是一维数组,也可以是另一个对行内容进行迭代的自定义迭代器
  • 完全跳过
    foreach
    ,并对
  • 循环使用两个嵌套的
    
    
    从某种意义上说,多维数组是一种一维数组,它使用维度信息来访问数据,就好像它们实际上是以二维形式存储的一样。因此,当通过许多方法(例如,从class
    array
    )访问时并且
    foreach
    iteration它被视为一维数组,因为这是内存中的实际布局。否则在迭代过程中,需要为每一行创建新的一维数组

    你可以尝试做以下事情来实现你的目标:

  • 使用交错数组而不是多维数组:
    int[][]
  • 创建扩展方法
    IEnumerable ByRows(此T[,]数组)
    ,该方法将创建对行进行适当迭代的迭代器。显然,行可以是一维数组,也可以是另一个对行内容进行迭代的自定义迭代器
  • 完全跳过
    foreach
    ,并对
  • 循环使用两个嵌套的
    
    
    问题不在foreach中,而是在从GetEnumerator返回的枚举器的实现中。它所做的是将多维数组视为一个连续的值数组(内存中就是这样)

    如果你想一想如何实现一个枚举器,这样它就给出了你想要的行为,它基本上就是在一个IEnumerable上进行枚举。这实际上是一个数组数组。C#用锯齿数组或int[]表示,正如其他人提到的那样


    相反,多维数组在C#中被建模为一段内存,您可以使用两个索引对其进行索引。您不能像使用交错数组那样使用一个索引对多维数组进行索引,然后返回一个数组。事实上,如果您尝试使用一个索引对多维数组进行索引,则会出现编译错误。您可以实现mult我将一维数组作为一维数组,自己计算将二维索引转换为一维索引。

    问题不在foreach中,而是在实现从GetEnumerator返回的枚举数。它所做的是将多维数组作为一个连续的值数组来处理(这就是记忆中的内容)

    如果你想一想如何实现一个枚举器,这样它就给出了你想要的行为,它基本上就是在一个IEnumerable上进行枚举。这实际上是一个数组数组。C#用锯齿数组或int[]表示,正如其他人提到的那样


    相反,多维数组在C#中被建模为一段内存,您可以使用两个索引对其进行索引。您不能像使用交错数组那样使用一个索引对多维数组进行索引,然后返回一个数组。事实上,如果您尝试使用一个索引对多维数组进行索引,则会出现编译错误。您可以实现multI将一维数组作为一维数组,自己做数学运算,将二维索引转换为一维索引。

    看起来您正在寻找的是锯齿数组,而不是多维数组:
    int[]]x=new int[][]{new[]{1,2,3},new[]{4,5,6},new[]{7,8,9},new[]{10,11,12}
    看起来你在寻找一个锯齿状数组,而不是多维数组:
    int[][]x=newint[][]{new[]{1,2,3},new[]{4,5,6},new[]{7,8,9},new[]{10,11,12};
    using System;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[,] x = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } };
                foreach (var i in x)
                {
                    foreach (var j in i)
                    {
                        Console.WriteLine(j);
                    }
                }
            }
        }
    }