Безопасный элемент доступа к массиву

Какой безопасный метод для доступа к элементу массива, не бросая IndexOutOfRangeException, что-то вроде TryParse, TryRead, используя методы расширения или LINQ?

3 ответа

Решение

Вы можете использовать следующий метод расширения.

public static bool TryGetElement<T>(this T[] array, int index, out T element) {
  if ( index < array.Length ) {
    element = array[index];
    return true;
  }
  element = default(T);
  return false;
}

Пример:

int[] array = GetSomeArray();
int value;
if ( array.TryGetElement(5, out value) ) { 
  ...
}

Используйте метод System.Linq ElementAtOrDefault. Он обрабатывает доступ вне допустимого диапазона без исключения. Возвращает значение по умолчанию в случае неверного индекса.

int[] array = { 4, 5, 6 };
int a = array.ElementAtOrDefault(0);    // output: 4
int b = array.ElementAtOrDefault(1);    // output: 5
int c = array.ElementAtOrDefault(-1);   // output: 0
int d = array.ElementAtOrDefault(1000); // output: 0

Сделайте это расширение нулевой проверкой и проверкой выхода за пределы диапазона.

public static class ArraySafe
{
    public static bool TryGetElement<T>(this T[] array, int index, out T element)
    {
        if(array == null || index < 0 || index >= array.Length)
        {
            element = default(T);
            return false;
        }

        element = array[index];
        return true;
    }
}

Применение:

public void Test()
    {
        int[] intAry = new Int32[10];
        int v;
        if (intAry.TryGetElement(6, out v))
        {
            //here got value
        }
    }

Если вы хотите безопасно перебрать элементы массива, просто используйте перечислитель:

foreach (int item in theArray) {
   // use the item variable to access the element
}
Другие вопросы по тегам