Размер (длина) массива в C #


98

Как определить размер массива (длину / количество элементов) в C #?


1
@Marcelo: ... но он все еще не может ответить на действительно простые вопросы вроде «Где мои очки». ;)
Guffa

2
Что вы имеете в виду под «размером»? Количество элементов или размер в байтах?
Фредрик Мёрк

2
@fearofawhackplanet Я проголосовал за, потому что у меня была такая же проблема с поиском длины, которая не работала для многомерных массивов, и в результате этого вопроса обнаружение Rank и GetLength (index).
TheMathemagician

1
@fearofawhackplanet Я считаю, что тот факт, что у него 145 000 просмотров, свидетельствует о его актуальности. Проголосовали.
brycejl 06

Ответы:


152

Если это одномерный массив 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};

Обратите внимание, что все 3 элемента cимеют разную длину. В этом случае, как и прежде c.Lengthбудет указывать число элементов c, (3) и c[0].Length, c[1].Lengthи c[2].Lengthбудет 3, 2 и 7, соответственно.


1
Для полноты вы также можете указать, как работают зубчатые массивы (например int[][]) ;-)
Лусеро

Я подумал об этом, @Lucerno, но решил, что это другая проблема - выяснение размера вещей внутри массива - зубчатый массив на самом деле просто одномерный массив, который, как я уверен, содержит массивы с одним размером, как я уверен, вы знаете .
Блэр Конрад

3
Конечно, я знаю, что вы правы, и поэтому я добавил комментарий смайликом, вместо того, чтобы писать ответ сам. Однако различие между [,]и [][]не кажется очевидным для всех новичков .NET, поэтому все же стоит отметить, что [][]в смысле ваших ответов это не многомерный массив.
Lucero

2
Хороший ответ. Но, возможно, вы захотите изменить b.GetLength[0] is 3 and b.GetLength[1] is 5должно быть b.GetLength(0) and b.GetLength(1).
Droogans

29

Вы можете посмотреть документацию по Array, чтобы узнать ответ на этот вопрос.

В этом конкретном случае вам, вероятно, понадобится длина :

int sizeOfArray = array.Length;

Но поскольку это такой простой вопрос, и у вас, несомненно, есть еще много подобных вопросов, вместо того, чтобы просто сказать вам ответ, я лучше расскажу вам, как найти ответ самостоятельно.

Visual Studio Intellisense

Когда вы вводите имя переменной и нажимаете .клавишу, он показывает вам список всех методов, свойств, событий и т. Д., Доступных для этого объекта. Когда вы выделяете участника, это дает вам краткое описание того, что он делает.

Нажмите F1

Если вы найдете метод или свойство, которые могут делать то, что вы хотите, но вы не уверены, вы можете навести на них курсор и нажать F1, чтобы получить помощь. Здесь вы получите более подробное описание и ссылки на соответствующую информацию.

Поиск

Условия поиска size of array in C#дают множество ссылок, которые расскажут вам ответ на ваш вопрос, и многое другое. Один из самых важных навыков, которым должен овладеть программист, - это поиск информации. Часто бывает быстрее найти ответ самостоятельно, особенно если тот же вопрос задавался раньше.

Воспользуйтесь учебником

Если вы только начинаете изучать C #, вам будет проще следовать руководству. Я могу порекомендовать учебные пособия по C # на MSDN. Если вам нужна книга, я бы порекомендовал Essential C # .

Переполнение стека

Если вы не можете найти ответ самостоятельно, задайте вопрос на сайте Stack Overflow. Но мы будем признательны, если вы покажете, что в первую очередь постарались найти ответ самостоятельно.


3
Отличная работа, Марк, но, может быть, и перебор!
Nayan

1
@Nayan: Спасибо! Хотя замечательно, что ОП быстро получил ответ от других плакатов, я считаю, что важнее научить новичков находить информацию, а не давать им ответы на конкретные вопросы. Я надеюсь, что ОП сочтет этот ответ полезным и избавит их от необходимости задавать сотни вопросов, на которые они могли бы найти ответы сами.
Марк Байерс

12
+1 за то, что нашел время применить этот подход - «дай человеку рыбу ...» и т. Д.
Питер Келли

Если мне когда-нибудь придется сделать то же самое, я просто перенаправлю OP на ваш ответ здесь =) И да, я полностью с вами согласен!
Nayan

1
Это хорошо, но я считаю, что это должно быть как-то связано автоматически. Разве они не могут открыть страницу с ответами, достойными просмотра? Однако я бы добавил, что перед отправкой вопроса следует проверить переполнение стека. Часто я просто начинаю публиковать вопрос, а затем вижу всплывающие окна с соответствующими вопросами. Я не уверен, существует ли ответ где-нибудь в Интернете, если он тоже не принадлежит здесь.
user420667

16

для одномерного массива

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

для многомерного массива

int length = listItems.Rank;

Чтобы получить размер 1 измерения

int length =  listItems.GetLength(0);

2
RankСвойство не возвращает количество элементов, она возвращает количество измерений.
Guffa

Где найти документацию по свойствам, поддерживаемым одномерными массивами? (т.е. Length, Rank, GetLength)
Minh Tran



5

Для одномерного массива вы используете Lengthсвойство:

int size = theArray.Length;

Для массивов с несколькими измерениями Lengthсвойство возвращает общее количество элементов в массиве. Вы можете использовать этот GetLengthметод, чтобы получить размер одного из измерений:

int size0 = theArray.GetLength(0);

3

В большинстве случаев используются «Длина» и «Счетчик».

Массив:

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]

0

То, что было упущено до сих пор, меня внезапно раздражало:

Как узнать количество элементов в массиве? Является ли .Lengthравно .Countиз списка?

Ответ таков: количество элементов типа X, которые были помещены в массив типа X, созданный с помощью, new X[number] вы должны нести сами !

Например. используя счетчик: int countItemsInArray = 0и countItemsInArray++для каждого присвоения вашему массиву.

(В только что созданном массиве new X[number]есть все пространство для numberэлементов (ссылок) типа X, уже выделенных, вы можете назначить любое место внутри в качестве своего первого назначения, например (if number= 100 и имя переменной = a) a[50] = new X();.

Я не знаю, указывает ли C # начальное значение каждого места внутри массива при создании, если это не так, или начальное значение, с которым вы не можете сравнивать (потому что это может быть значение, которое вы сами поместили в массив), вы пришлось бы отслеживать, какие места внутри массива, которому вы уже назначили, тоже, если вы не назначаете последовательно, начиная с 0(в этом случае все места меньше, чем countItemsInArrayбыли бы назначены).

В вашем вопросе размер массива (длина / количество элементов) в зависимости от того, предназначен ли / для обозначения «альтернативы» или «деления на», последний по-прежнему должен быть охвачен («количество элементов», которое я только что дал как » количество элементов "и другие, .Lengthчто соответствует значению numberв моем коде выше):

В C # есть sizeofоператор ( https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/sizeof ). Безопасно использовать для встроенных типов (таких как int) (и работает только с типами (а не с переменными)). Таким образом, размер массива bтипа intв байтах будет b.Length * sizeof(int).

(Из-за того, что все пространство массива уже выделено при создании, как упомянуто выше, и sizeofработает только с типами, никакой код вроде sizeof(variable)/sizeof(type)бы не будет работать или давать количество элементов без отслеживания.)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.