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
,并对
循环使用两个嵌套的
从某种意义上说,多维数组是一种一维数组,它使用维度信息来访问数据,就好像它们实际上是以二维形式存储的一样。因此,当通过许多方法(例如,从classarray
)访问时并且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);
}
}
}
}
}