Итак, что возвращают функции поиска индекса в массивах, если элемент не найден?
Предположим у нас есть метод возвращающий Array:
Array GetArray() { return … }
И код который ищет в нем число:
Array array = GetArray(); int index = Array.IndexOf(array, 42); if (index != -1) { // do something }
Все знакомо и привычно, но сверившись с документацией, с удивлением обнаруживаем что методы IndexOf(Array ...), в случае не нахождения элемента возвращают не
-1, а нижнюю границу массива - 1.Отсюда вытекает два вывода:
1. Можно создать массив начинающийся не с 0.
2. Код выше некорректен.
Пример создания массива не с 0:
Array array = Array.CreateInstance(typeof(int), new int[] { 3 }, new int[] { -1 });
В этом примере создается массив из трех элементов, индексация начинается с
-1.Правильный код выглядит следующим образом:
Array array = GetArray(); int index = Array.IndexOf(array, 42); if (index != (array.GetLowerBound(0) - 1)) { // do something }
Я думаю эта особенность создана для языков платформы .NET где индексация начинается с 1.
Помимо этого, в документации описан отдельный случай, когда нижняя граница равна
int.MinValue. В этом случае метод IndexOf вернет int.MaxValue что соотвествует int.MinValue - 1 (переполнение).Всем спасибо за внимание!

