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

89

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

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

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

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

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

splatto
источник
Вы имеете в виду, что хотите знать, есть ли какое-то значение для массива [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
}
theJerm
источник
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();
}
Джонни Д. Кано -Посуда-
источник
1

array.length скажет вам, сколько элементов в массиве

Майк Миллер
источник
0

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

JB King
источник
0

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

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

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

Колин Десмонд
источник
0

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

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

Клин
источник