数组的数组(2009)

2020-12-20 11:16:37

大多数C#开发人员都知道,“矩形”和“粗糙”的二维数组之间是有区别的。 int [,]矩形= {{10,20},{30,40},{50,60}}; int [] []破烂= {new [] {10},new [] {20,30},new [] {40,50,60}}; 在这里,我们有一个包含六个元素的二维数组,排列成三行,每行两个元素。 我们有一个包含三个元素的一维数组,其中每个元素本身就是一个包含一个,两个或三个元素的一维数组。 这非常简单。 当您尝试制作一个二维数组的参差不齐的数组时,事情就容易被大脑破坏。 快速,不要想,只需回答即可。 选项一:这是一维数组,每个元素都是一个整数的二维数组。 选项2:这是一个二维数组,每个元素都是一个一维整数数组。 好的,既然您有个简单的答案,请仔细考虑。 您的答案会改变吗?

我暂时不会告诉你答案。相反,让我们探索每种可能性的后果。

当然,将任何类型放入数组的方式都是将[]附加到类型说明中,对吗?但是在选项二中,您将[,]插入中间。

可是等等。如果[,] []的意思是“ 2-d的1-d”,那么您从页面上读取的顺序与您说的顺序相反-看起来像是两维继之以一维-东西,那为什么不读“ 1-d的2-d”呢?

但是,为什么int首先出现?按照这种逻辑,它应该排在最后。

啊也许第一种选择并不完全明智。显然,这两种选择都不尽如人意。那好吧。让我们继续。

现在假设您要在该数组中获取一个值,并假设它已正确初始化以在我们需要的任何地方都有很多元素。你会怎么做?

假设我们处于选项一。这是一维数组。因此crazy [10]是一个二维数组。因此crazy [10] [1、2]是一个整数。

假设我们处于第二种选择。这是一个二维数组。因此crazy [1,2]是一维数组。因此crazy [1,2] [10]是一个整数。

选项一很奇怪-疯狂的类型为int [,] [],但您将其取消引用为[10] [1,2]!鉴于第二种选择是明智的;取消引用语法与类型名称语法的顺序完全匹配。

现在,假设您要初始化“外部”数组,但稍后将填充“参差不齐”的内部数组。首先,只需将它们设置为null。初始化外部数组的合适语法是什么?

假设我们处于选项一。这是一维数组。因此,应将其初始化为crazy = new int [,] [20];对?

假设我们处于第二种选择。这是一个二维数组。因此,应将其初始化为crazy = new int [] [4,5];对?

选项二很奇怪。我们说int [,] [],但将其初始化为[] [4,5]。选项一是明智的。

一团糟。无论我们选择哪种选择,最终都会导致某些事情与我们的直觉不符。这是我们在C#中实际选择的内容。

首先,第二种选择是正确的。我们强迫您忍受后果之一带来的怪异。您实际上并没有通过添加数组说明符使元素类型成为该类型的数组。通过将说明符放在现有数组说明符列表的前面,可以将其变为数组类型。疯狂但真实。

这样可以避免您因后果二而感到奇怪。在此选项中,取消引用的发生与声明的词法结构相同。

那后果三呢?这才是真正的弯腰。我给你的选择都不正确。显然我是一个偷偷摸摸的人。在C#中初始化此类数组的正确方法是:

这里的设计原则是用户希望括号和逗号的词法结构在声明,初始化和取消引用之间保持一致。选项二是确保声明的形状为[,] []的最佳方法,而初始化也具有该形状,因此取消引用也是如此。

综上所述,多维参差不齐的数组几乎可以肯定是一种不好的代码味道。希望您永远不会在生产环境中使用这些规则的新知识。

如果您可以改用通用集合,则生活会更好。完全清楚什么是List< int [,]>。表示–这是二维数组的列表。而List< int> [,]表示int列表的二维数组。