数组访问的安全元素

Posted

技术标签:

【中文标题】数组访问的安全元素【英文标题】:Safe element of array access 【发布时间】:2010-10-16 03:41:48 【问题描述】:

使用扩展方法或 LINQ 访问数组元素的安全方法是什么,而不抛出 IndexOutOfRangeExceptionTryParseTryRead

【问题讨论】:

【参考方案1】:

使用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

另见:DotNetPearls - ElementAt

【讨论】:

【参考方案2】:

您可以使用以下扩展方法。

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) )  
  ...

【讨论】:

您应该将array[i] 更改为array[index]。另外,我认为你的逻辑是倒退的。如果 array.Length @Jim,这就是我在喝完咖啡之前发布的内容。修正错别字 可能还想检查索引 >= 0。【参考方案3】:

将此扩展为空检查和超出范围检查。

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
        
    

【讨论】:

【参考方案4】:

如果您想安全地循环遍历数组中的元素,只需使用枚举器即可:

foreach (int item in theArray) 
   // use the item variable to access the element

【讨论】:

不,我阅读了命令行参数并且必须确保下一个参数存在而不抛出异常(没有循环退出)

以上是关于数组访问的安全元素的主要内容,如果未能解决你的问题,请参考以下文章

swift:安全访问 SCNNode 数组的字典

锁对象数组可用于保证对 MyClassArray 的线程安全访问?

访问数组元素进行获取和访问数组元素进行赋值

java中的线程安全随机访问循环数组?

在 Angular 2 中访问数组元素的数组

如何使用反射访问安全元素