Безопасный элемент доступа к массиву
Какой безопасный метод для доступа к элементу массива, не бросая 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
}