【问题标题】:IndexOutOfRangeException - Assume 0IndexOutOfRangeException - 假设 0
【发布时间】:2014-08-11 15:24:05
【问题描述】:

我正在处理一个数组,我想在其中添加一些值。在某些情况下,因为只需要一次计算就可以完成,它会要求数组之外的索引。

有没有办法说,'如果索引在数组之外,假设值是 0'?

有点像这样:

                   try
                   {

                   grid[x,y] = grid[x-1,y] + grid[x-1,y-1];
                   //This is simplified 

                   x++;

                   }

                   catch (IndexOutOfRangeException)
                   {                           
                           grid[x - 1, y - 1] = 0;
                   }

【问题讨论】:

  • 数组是固定大小的,所以希望您不必对合法索引进行猜测。执行检查并根据需要对索引进行调整比捕获异常要好得多。
  • 查找三元运算符!喜欢grid[x <= legalSize? x : 0]
  • 对于一维数组,您可以简单地使用ElementAtOrDefault,它已经返回了您想要的值。
  • @TaW 应该是x < legalSize,你也可以加0 <= x

标签: c# arrays indexoutofrangeexception


【解决方案1】:

为简单起见,假设您有一个整数数组,您可以考虑extension method,如下所示:

static class ArrayExtension
{
    static int SafeGetAt(this int[,] a, int i, int j)
    {
        if(i < 0 || i >= a.GetLength(0) || j < 0 || j >= a.GetLength(1))
            return 0;
        return a[i, j];
    }
}

然后访问数组元素为

grid.SafeGetAt(x, y);

另一种方法是创建一个包装类,该类在内部访问数组并实现indexer。在这种情况下,您可以继续使用[,]-syntax 来访问元素。


我不建议使用异常,因为异常很慢,应该在常规应用程序工作流程中避免。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 2011-05-13
    • 1970-01-01
    • 2018-04-15
    • 2011-09-22
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多