迭代数组时,在C#中索引超出范围异常

时间:2013-06-10 06:15:47

标签: c# indexing range out

我有这个代码,我用来创建一个程序,它接受一个范围,并输出到控制台的素数。我有一个问题,我正在尝试遍历我构建的数组,因此循环应该只使用我方法的返回值向控制台写入素数值。我遇到的问题是我将第二个条件设置为numArray.Length,但它似乎给了我Index out of Range Exception。我只是希望循环迭代numArray中的所有值,并在完成后确定最后一个值是否为素数。

public struct Prime
{
    public int x;


    // constructor for Prime
    public Prime(int x1)
    {
        x = x1;

    }

    public int IsPrime(int number)
    {
        int i;
        for (i = 2; i * i <= number; i++)
        {
            if (number % i == 0) return 0;
        }
        return 1;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Enter an Integer");
        int num1 = Convert.ToInt32(Console.ReadLine());
        Console.WriteLine("Enter a Second Integer of Greater Value");
    //    int num2 = 0;
        int num2 = Convert.ToInt32(Console.ReadLine());

    /*    if (num2temp > num1)
        {
            num2temp = num2;
        }
        else
        {
            Console.WriteLine("You Did Not Enter An Integer Greater Than the First Integer, Please Enter Your Integers Again.");
            Environment.Exit(0);
        }
    */    int index = 1;
        int[] numArray = new int[num2];
        for (int i = num1; i <= num2; i++)
        {
            numArray[index] = i;

            Console.WriteLine(" index: {0} assignment: {1}", index, i);
            index++;
            Console.WriteLine("index: {0}",index);
        }

        Console.WriteLine("value: {0}", numArray[40]);

    /*    Prime myprime = new Prime();

        if (myprime.IsPrime(numArray[12]) == 1)
        {
            Console.WriteLine("true");
        }
        else
        {
            Console.WriteLine("False");
        } */


        Prime myprime = new Prime();


       int value = 0;
        for (int y = 1; y <= num2; y++)
        {
            if (myprime.IsPrime(numArray[y]) == 1)
            {
                value = numArray[y];
                Console.Write("{0} \t", value);

            }

        } 

2 个答案:

答案 0 :(得分:3)

您目前正在尝试迭代并包含数组的大小。数组在C#中被索引为0。所以这个:

int[] numArray = new int[num2];
for (int i = num1; i <= num2; i++)

应该是:

for (int i = num1; i < num2; i++)

请注意,要获得第一个元素数组,num1必须为0,而不是1。

同样,您index 1的初始分配应为0。基本上你需要遍历所有的代码(目前很多位被注释掉了)并检查你假设数组是基于1的所有地方,而是改变你的代码,因为它们是基于0的。 / p>

(在某些情况下,你可能只想让数组更大一些。如果你想要一个逻辑上包含值1到x的数组,你可以创建一个大小为x的数组并从每个数组中减去一个索引始终,或创建一个大小为x + 1的数组。)

答案 1 :(得分:2)

您的索引从1开始,但应从0开始:

int index = 0; //CHANGE HERE
int[] numArray = new int[num2];
for (int i = num1; i <= num2; i++)
{
    numArray[index] = i;

    Console.WriteLine(" index: {0} assignment: {1}", index, i);
    index++;
    Console.WriteLine("index: {0}",index);
}

然后这里y也应该是0并检查它是否小于num2:

for (int y = 0; y < num2; y++)
{
    if (myprime.IsPrime(numArray[y]) == 1)
    {
        value = numArray[y];
        Console.Write("{0} \t", value);

    }

} 

因为C#中的数组索引从0开始。