【问题标题】:Express one dimension of 2d array as new array将二维数组的一维表示为新数组
【发布时间】:2011-02-28 19:55:40
【问题描述】:

我有一个二维数组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 的数组吗?我遇到了一些“内存不足”的错误。

【问题讨论】:

  • 尊敬的用户208080!这个网站是社区,而不仅仅是寻求帮助的地方。请尊重规则。您问了 5 个问题,但没有将任何答案标记为已接受。非常感激!并格式化您的代码!
  • 65000x65000 int array = 15.7393515 GB 内存一次。是的,如果你有足够的空闲内存,你可以这样做,但现在的问题是你是否应该这样做;)
  • 你想解决什么问题?
  • @Juliet 在 32 位系统中你不能,即使你有那么多物理内存

标签: c#


【解决方案1】:

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

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

【讨论】:

  • @Andrey:呵呵……好点。我应该说“40 亿项”之类的东西。我会适当地编辑。
【解决方案2】:

ints 的 65000 x 65000 数组将占用大约 16 GB 的内存,因此出现内存不足错误也就不足为奇了。上次尝试时,我无法让单个 .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 以满足您的连接需求。第二个有很多重载,但您可能需要第一个来显示整数。

【讨论】:

  • 非常感谢您的回答。我真的很感激。
  • @user208080:不客气。习惯上对有用的答案进行投票,并将最能回答您问题的答案标记为已接受的答案。不是说那是我的,但如果您接受有用的答案,您将来更有可能获得帮助。此外,它使 SO 成为一个更好的网站,作为其他人的参考。他们不必阅读所有答案,因为最好的答案在列表的顶部:)
【解决方案3】:

处理这个问题的最简单方法是创建一个jagged array

int[][] i = new int[3][];

那样:

string b = concatenate(i[0]); 可以工作。

对于您的第二个问题,您将遇到LOH 的问题,其中对象接近该大小。不过,这可能不是您的问题。我会查看here 以了解原因的可能解释。

【讨论】:

    【解决方案4】:

    您需要使用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

    【讨论】:

    • 非常感谢你们。现在可以了。感谢您的帮助。
    猜你喜欢
    • 2010-11-29
    • 2018-11-20
    • 2016-02-18
    • 2018-02-19
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多