使用此代码时,在c#中索引越界

时间:2014-02-04 10:16:54

标签: c#

如果我有1到100位数,我应该得到

的输出
1--100 
2--99
 3--98 
.  
.. 
.. 
49---50 

代码低于其给定索引的界限,数组没有多维度

static void Main(string[] args)
{
    //// A. 2D array of strings.
    string[][] a = new string[100][];

    int bound0 = a.GetUpperBound(0);
    int bound1 = a.GetUpperBound(1);
    for (int i = 0; i <= bound0; i++)
    {
        for (int x = 100; x <= bound1; x--)
        {
            string s1 = a[i][x];
            Console.WriteLine(s1);
        }
    }
    Console.WriteLine();
    Console.ReadKey();
}

4 个答案:

答案 0 :(得分:5)

您需要为数组提供第二个维度。在内部循环中,您递减loop变量而不是递增,这也会导致超出范围的异常。您可能需要知道锯齿状和二维数组之间的区别。 post可以解释这一点。 这个语句int bound1 = a.GetUpperBound(1);由于尚未声明第二个维度,因此给出了异常。

使用锯齿状数组。

string[][] a = new string[100][];
int bound0 = a.GetUpperBound(0);
for(int i = 0; i <= bound0; i++)
a[i] = new string[3];

for (int i = 0; i <= bound0; i++)
{
        int bound1 = a[i].GetUpperBound(0);
        for (int x = 0; x <= bound1; x++)
        {
            a[i][x] = (i + x).ToString();
            string s1 = a[i][x];
            Console.WriteLine(s1);
        }
 }

使用二维数组。

string[,] a = new string[100,4];
int bound0 = a.GetUpperBound(0);
int bound1 = a.GetUpperBound(1);
for (int i = 0; i < bound0; i++)
{
    for (int x = 0; x < bound1; x++)
    {
        a[i,x] = (i+x).ToString();
        string s1 = a[i,x];
        Console.WriteLine(s1);
    }
}
Console.WriteLine();
Console.ReadKey();

修改,基于更新

string[][] a = new string[100][];
int bound0 = a.GetUpperBound(0);
for(int i = 0; i <= bound0; i++)
a[i] = new string[100];

for (int i = 0; i <= bound0; i++)
{
        int bound1 = a[i].GetUpperBound(0);
        for (int x = bound1; x >= 0; x--)
        {
            a[i][x] = (i+1).ToString() +"--"+ (x+1).ToString();
            string s1 = a[i][x];
            Console.WriteLine(s1);
        }
 }

答案 1 :(得分:0)

使用a.GetUpperBound(1)=&gt;你已经定义了你没有的阵列的第二个维度 你也在内部for循环中递减x(x--)

下面是您的代码的工作示例,但结果将是空字符串,因为您没有初始化数组

static void Main(string[] args)
{
    //// A. 2D array of strings.
    string[,] a = new string[100, 4];

    int bound0 = a.GetUpperBound(0);
    int bound1 = a.GetUpperBound(1);
    for (int i = 0; i <= bound0; i++)
    {
         for (int x = 0; x <= bound1; x++)
         {
               string s1 = a[i, x];
               Console.WriteLine(s1);
         }
    }
    Console.WriteLine();
    Console.ReadKey();
}

问候

答案 2 :(得分:0)

您没有创建2D字符串数组。您正在创建的是一个字符串数组数组。这意味着“内部”数组可以具有任何长度,而“外部”数组当然不知道这一点。因此,要么将数组创建为2D(new string[100, something]),要么稍后请求上限。一个更好的代码就是:

string[][] a = new string[100][];

// Don't forget to create all the subarrays, eg.:
// for (int i = 0; i < a.Length; i ++) a[i] = new string[10];

for (int i = 0; i < a.Length; i++)
{
  for (int j = 0; j < a[i].Length; j++)
  {
    Console.WriteLine(a[i][j]);
  }
}

无论如何,如果你想说的是真的,你就是以一种完全疯狂的方式做到这一点。为什么不这样做呢?

void PrintDigitPairs(int lowerBound, int upperBound)
{
 for (int i = lowerBound; i <= lowerBound + upperBound / 2; i++)
 {
   Console.WriteLine(i + "-" + (upperBound - i + 1));
 }
}

答案 3 :(得分:0)

我相信您只希望在x 更大然后绑定时运行第二个循环:

for (int i = 0; i <= bound0; i++)
{
    //                  | change here from <= to >=
    for (int x = 100; x >= bound1; x--)
    {
        string s1 = a[i][x];
        Console.WriteLine(s1);
    }
}