Чи існує індекс масиву


90

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

Чи є спосіб перевірити, чи є якесь довільне число допустимим елементом масиву?

Приклад - мені потрібно перевірити, чи існує масив [25].

Бажано, щоб я віддав перевагу робити це, не виконуючи foreach () через масив, щоб знайти рядки.

Чи є спосіб зробити це, чи я застряг у циклі foreach?


Ви маєте на увазі, що хочете знати, якщо якесь значення для масиву [x] == 25? Я думаю, ви заплутаєте людей у ​​тому, про що просите, запитуючи, чи існує масив [25]. Звичайно, це існує, якщо в масиві є 26 або більше елементів, але я не думаю, що це те, про що ви просите.
kevin42

Програма, в якій я працюю, має два можливі масиви з однаковим ім'ям файлу. Один має 21 елемент, а Інший - 30-то. Мені потрібно значення в масиві [25], якщо воно має існувати.
splatto

Відповіді:


144

Перевірте довжину

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

3
Дякую. Не можу повірити, що не думав про властивість .Length!
splatto

13
Переконайтеся, що індекс> = 0 також.
Andreas Grech,

2
І переконайтесь, що сам масив не є нульовим :)
Shimmy Weitzhandler

1
Оскільки індекси масивів повинні бути послідовними в C #, це відповідає дійсності. Є типи колекцій, які не мають послідовних індексів, але це не основні типи масивів у C #.
повторно

100

Ви можете використовувати 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, тоді масив [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.