C#中的数组大小(长度)

118

在C#中,如何确定数组的大小(长度/项数)?


1
@Marcelo:...但它仍然无法回答一些非常简单的问题,比如“我的眼镜在哪里”。;) - Guffa
2
“size”是什么意思?是指元素的数量还是字节大小? - Fredrik Mörk
2
@fearofawhackplanet 我点赞了,因为我也遇到了多维数组无法使用 Length 方法的问题,而通过这个问题发现了 Rank 和 GetLength(index)。 - TheMathemagician
1
@fearofawhackplanet 我相信它有145,000次观看的事实证明了它的相关性。已点赞。 - brycejl
9个回答

172

如果它是一个一维数组 a

a.Length

将给出a的元素数量。

如果b是一个矩形的多维数组(例如,int[,] b = new int[3, 5];

b.Rank

将返回维度数(2),以及

b.GetLength(dimensionIndex)

这将获取任何给定维度的长度(基于0的索引,因此b.GetLength(0)为3,b.GetLength(1)为5)。

有关更多信息,请参见System.Array文档

正如@Lucero在评论中指出的那样,存在“交错数组”这个概念,它实际上只是单维数组(通常是单维数组)的一维数组。

例如,可以有以下内容:

int[][] c = new int[3][];
c[0] = new int[] {1, 2, 3};
c[1] = new int[] {3, 14};
c[2] = new int[] {1, 1, 2, 3, 5, 8, 13};
请注意,c 的三个成员具有不同的长度。 在这种情况下,与之前一样,c.Length 将指示 c 的元素数(3),而 c[0].Lengthc[1].Lengthc[2].Length 分别为 3、2 和 7。

1
为了完整起见,您还可以列出嵌套数组的工作方式(例如 int[][]);-) - Lucero
我考虑了一下,@Lucerno,但发现这是另一个问题——找出数组内部的东西的大小——一个不规则数组实际上只是一个包含单维数组的单维数组,我相信你知道的。 - Blair Conrad
4
当然我知道你是正确的,这就是为什么我用笑脸添加了评论而不是自己写答案。然而,“[,]”与“[][]”之间的区别对于所有的.NET新手似乎并不清楚,因此说明“[][]”不是多维数组可能仍然值得注意。 - Lucero
2
好的回答。但是,您可能想要更改b.GetLength[0] is 3 and b.GetLength[1] is 5b.GetLength(0)和b.GetLength(1) - yurisich

31
你可以查看Array的文档以找到这个问题的答案。

在这种情况下,你可能需要使用Length

int sizeOfArray = array.Length;

但是,由于这是一个非常基本的问题,而且您无疑还有许多类似的问题,因此我不仅要告诉您答案,还要告诉您如何自己找到答案。

Visual Studio Intellisense

当您键入变量名称并按下 . 键时,它会显示该对象上可用的所有方法、属性、事件等列表。当您突出显示成员时,它会给出简短的描述。

按F1键

如果您找到了可能做你想要的事情的方法或属性,但不确定,可以将光标移动到它上面并按F1获取帮助。在这里,您可以获得更详细的描述以及相关信息的链接。

搜索

搜索术语C#中数组的大小会给出许多链接,告诉您问题的答案以及更多信息。程序员必须学习的最重要的技能之一是如何查找信息。如果之前已经有人问过同样的问题,那么自己找到答案通常更快。

使用教程

如果您刚开始学习C#,那么跟随教程会更容易。我可以推荐MSDN上的C#教程。如果您想要一本书,我建议看看Essential C#

Stack Overflow

如果您无法自己找到答案,请随时在Stack Overflow上发布问题。但是,我们希望您先显示出自己已经努力寻找答案的努力。


3
干得不错,马克,但可能有点过头了! - Nayan
2
@Nayan:谢谢!虽然其他帖子的回答者很快地回答了问题,但我认为教初学者如何查找信息比教他们针对具体问题的答案更重要。我希望这个回答对 OP 有用,并且能让他们避免问出那些本可以自己找到答案的数百个问题。 - Mark Byers
13
感谢您花时间采用这种方法,给予别人渔不如授人以渔的教诲。+1 - Peter Kelly
如果我以后需要做同样的事情,我会直接将OPs重定向到你在这里的答案=)是的,我完全同意你的观点! - Nayan
1
这很好,但我觉得应该自动链接到某个地方。他们不能开一个“有价值回答”页面吗?不过我想补充的是,在发布问题之前应该先检查一下Stack Overflow本身。通常我会开始发布问题,然后看到相关的弹出式问题。如果答案不在这里,我就不确定它是否存在于互联网上的其他地方。 - user420667
真是浪费时间!在你讲解如何寻找答案之前,我认为可以肯定地说这里的任何答案都没有回答实际问题。OP问的是如何获取数组的SIZE而不是长度。我搜索同样的问题也来到了这里。我想知道如何确定数组的SIZE而不是其中有多少项。例如new string[5]{"foo"}=一个SIZE为5且LENGTH为1的数组..明白吗?如果我将一个数组传递到一个方法中,我怎么知道它是否能够容纳另一个值?比较SIZE和LENGTH。 - JBeckton

20

对于一维数组

int[] listItems = new int[] {2,4,8};
int length = listItems.Length;

对于多维数组

int length = listItems.Rank;

获取一个维度的大小

int length =  listItems.GetLength(0);

2
“Rank” 属性不返回项目数量,而是返回维度数量。 - Guffa
一维数组支持的属性有哪些?(比如 LengthRankGetLength),我该在哪里找到文档? - Minh Tran

11

yourArray.Length :)


8
使用 Length 属性。
int[] foo = new int[10];
int n = foo.Length; // n == 10

5

对于一个一维数组,您可以使用 Length 属性:

int size = theArray.Length;

对于多维数组,Length 属性返回数组中所有项的总数。您可以使用 GetLength 方法来获取其中一个维度的大小:

int size0 = theArray.GetLength(0);

4
在大部分情况下,我们使用“长度”和“计数”来描述。

数组:

int[] myArray = new int[size];
int noOfElements = myArray.Length;

类型化列表数组:

List <int> myArray = new List<int>();
int noOfElements = myArray.Count;

1

它应该是这样的: 1D:

 type[] name=new type[size]  //or =new type[]{.....elements...}

2D:

 type[][]name=new type[size][] //second brackets are emtpy

当你使用这个数组时:

 name[i]=new type[size_of_sec.Dim]

或者你可以声明类似于矩阵的东西

type[ , ] name=new type [size1,size2]

1
到目前为止被忽略的是我突然感到烦恼的事情:如何知道数组中的项目数量?.Length 是否等同于列表的.Count
答案是:类型为X的项的数量,已经放入使用new X[number]创建的类型为X的数组中,您必须自己处理
例如,使用计数器:int countItemsInArray = 0 并且每次分配给数组时 countItemsInArray++
(刚用new X[number]创建的数组已经分配了所有空间,可以将其分配给内部的任何位置作为第一个分配,例如(如果number = 100,变量名=aa[50] = new X();。)
我不知道C#是否在创建数组时指定了每个位置的初始值,如果没有或者您无法比较初始值(因为它可能是您自己放入数组的值),则需要跟踪数组中已分配的位置,如果您不从0开始顺序分配(在这种情况下,小于countItemsInArray的所有位置都将被分配)。
根据您的问题,数组的大小(长度/项目数)取决于“/”是表示“替代”还是“除以”,后者仍需涉及(我刚刚提到的“项目数量”和其他人给出的.Length对应于上面代码中的number的值)。

C#有一个sizeof运算符(https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/sizeof)。它对于内置类型(如int)是安全的(并且仅操作类型(而不是变量))。因此,类型为int 的数组b的大小(以字节为单位)将是b.Length * sizeof(int)

由于数组的所有空间已经在创建时分配,就像上面提到的那样,而sizeof只能用于类型,所以类似sizeof(variable)/sizeof(type)的代码将无法工作或产生项的数量,除非进行跟踪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接