将2d数组的一维表示为新数组

时间:2010-06-07 17:49:57

标签: c#

我有一个二维数组a[3,3]。如何将一个维度表示为一个新数组并将其传递给某个函数?

int[,] a = new int[3,3];

a[0,0] = 1;

...

string b = concatenate(a[0]);     // where concatenate is a function
                                  // take a one dimension array as param

另外,我可以使用C#创建65000x65000阵列吗?我得到了一些“内存不足”错误。

4 个答案:

答案 0 :(得分:7)

处理此问题的最简单方法是创建jagged array

int[][] i = new int[3][];
那样:

string b = concatenate(i[0]);将有效。

对于第二个问题,如果对象接近该大小,您将遇到LOH的问题。这可能不是你的问题。我会看here关于原因的可能解释。

答案 1 :(得分:3)

您需要使用jagged arrays

int[][] a = new int[3][]
a[0] = new int[3];
a[1] = new int[3];
a[2] = new int[3];
a[0][0] = 1;
string b = concatentate(a[0]);

此外,创建65000x65000阵列将导致65000 ^ 2 = 4225000000个插槽(或大约16GB或数据),因此难怪您获得OutOfMemoryException

答案 2 :(得分:2)

为了回答你的第二个问题,一个65k x 65k的二维阵列有超过40亿个项目;一个4字节的整数类型的时钟大小约为16GB。如果你的盒子上没有足够的内存来初始化16GB的内存块,那么,不,你不能创建一个65k x 65k的阵列。这甚至不会解决您尝试在该阵列上进行查找时遇到的寻址问题。太大了,伙计。太大。

要回答第一个问题,二维数组是一个与一维数组不兼容的独特结构。如果你创建一个锯齿状数组(这是一个数组数组),你将能够做你想要的。

答案 3 :(得分:1)

一个65000乘65000的int数组会占用大约16千兆字节的内存,因此出现内存不足的错误并不奇怪。我上次尝试时无法让一个.NET 3.5应用程序分配超过1.7GB的内存,所以没有运气。

至于将一个维度传递给函数,它取决于。您可以使用jagged array

执行所需操作
int[][] array = new int[3][];
for (int i = 0; i < array.Length; i++)
    array[i] = new int[3];

string b = concatenate(array[0]);

这样,第一维中的每个位置都是它自己的数组,你可以传递它(如在最后一行中)。如果你想在另一个'方向'传递一行项目,你必须先复制项目。

PS:您可能希望查看String.JoinString.Concat以了解您的连接需求。第二个有很多重载,但你可能需要第一个显示整数。