Существует ли индекс массива


89

Я унаследовал код на работе, от которого действительно плохо пахнет. Я надеюсь найти самое безболезненное решение.

Есть ли способ проверить, является ли какое-то произвольное число допустимым элементом в массиве?

Пример - мне нужно проверить, существует ли массив [25].

Я бы предпочел сделать это, не выполняя foreach () через массив, чтобы найти строки.

Есть ли способ сделать это, или я застрял в цикле foreach?


Вы имеете в виду, что хотите знать, есть ли какое-то значение для массива [x] == 25? Я думаю, вы сбиваете с толку людей, спрашивая, существует ли array [25]. Конечно, он существует, если в массиве 26 или более элементов, но я не думаю, что это то, о чем вы просите.
kevin42

Программа, в которой я работаю, имеет два возможных массива с одинаковыми именами файлов. В одном 21 элемент, а в другом 30 с чем-то. Мне нужно значение в массиве [25], если оно существует.
splatto

Ответы:


144

Проверить длину

int index = 25;
if(index < array.Length)
{
    //it exists
}

3
Спасибо. Не могу поверить, что не подумал о свойстве .Length!
splatto

13
Убедитесь, что index> = 0.
Андреас Греч

2
И убедитесь, что сам массив не равен нулю :)
Шимми Вейтцхандлер

1
Поскольку в C # индексы массивов должны быть последовательными, это верно. Есть типы коллекций, у которых нет последовательных индексов, но это не базовые типы массивов в C #.
повтор

99

Вы также можете использовать LINQ для этого:

var exists = array.ElementAtOrDefault(index) != null;

4
Спасибо, это то, что я искал вместо корявой проверки длины массива.
Starceaker

6
Незначительное примечание, new object[]{ null }.ElementAtOrDefault(index)вернется, nullпоскольку элемент в 0 имеет значение null . Использование ElementAtOrDefaultне является отличным решением для проверки индексов массивов существуют , что проверка равенства добавляется в конце делает результаты неопределимыми.
Крис Марисич

@ChrisMarisic Не могли бы вы привести пример?
FMFF

2
@ChrisMarisic, ты прав, только на случай, если ты хочешь проверить существование array.Length > index.
Шимми Вайцхандлер

2
@ChrisMarisic, на самом деле это важное замечание, подобные решения приведут к скрытым ошибкам
amd

21

Что именно вы подразумеваете под «действительным элементом»? Вы могли просто сделать:

if (array.Length >= 26)

который скажет вам, является ли 25 допустимым индексом в массиве или нет (при условии, что нижняя граница 0).

Если вам нужно знать, не является ли он нулевым или нет, просто используйте:

if (array[25] != null)

(или их комбинация).

Если это не помогает, дайте более точное значение слова «действительный» для вашей проблемы.


3
для второго примера я получил это. Index was outside the bounds of the array
Мухаммад Рахил

4
@raheel: Ну, тогда похоже, что тебе следовало использовать вместо этого первый тест ...
Джон Скит

11

Предполагая, что вы также хотите проверить, не является ли элемент не нулевым

if (array.Length > 25 && array[25] != null)
{
    //it exists
}

1
Примечание: Got использовать &&в if (array.Length > 25 && array[25] != null), если использование одного &бросит IndexOutOfRange исключение. MSDN .
контрольная сумма

3
// I'd modify this slightly to be more resilient to a bad parameter
// it will handle your case and better handle other cases given to it:

int index = 25;

if (index >= 0 && index < array.Length)
{
    // Array element found
}

1

Вы можете использовать длину массива и посмотреть, подходит ли ваше произвольное число в этот диапазон. Например, если у вас есть массив размером 10, то array [25] недействителен, потому что 25 не меньше 10.


1

Вы можете использовать список, чтобы проверить его существование.

List<int> l = new List<int>();
l.Add(45);
...
...

if (l.Count == 25) {
  doStuff();
}
int num = 45;
if (l.Contains(num)) {
  doMoreStuff();
}


0

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


0

Вы можете проверить длину массива, чтобы убедиться, что элемент 25 действителен в том смысле, что он находится в массиве, тогда вы можете использовать

if (array.Length > 25)
{ 
   if (array[25] != null)
   {
       //good
   }
}

чтобы увидеть, был ли установлен сам элемент массива.


0

Похоже, вы используете массив для хранения разных полей. Это определенно запах кода. Я бы по возможности избегал использования массивов, поскольку они обычно не подходят (или не нужны) в высокоуровневом коде.

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

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