索引超出了数组的范围 - For循环

时间:2017-01-17 05:20:37

标签: c# for-loop indexoutofboundsexception

注意:这不是重复的,类似的问题按名称和主题不解释。

我正在尝试按照数字顺序对数字数组进行排序,同时还会折叠前一个增加1的任何数字,因此921,922,923变为921-923。

我写的代码是:

static string FormatReceiptNumbers(int[] numbers)
{
    int[] sortedNumbers = numbers;
    Array.Sort(sortedNumbers);
    string output = "";

    //Sort through each element
    for(int x = 0; x < sortedNumbers.Length; x++)
    {
            //Check for Incrementing value
            if(x > 0 & sortedNumbers[x] == sortedNumbers[x - 1] - 1)
            {
                //Check if incrementing value doesn't keep going
                for(int y = x; y < sortedNumbers.Length; y++)
                {
                    //check if incrementing values end
                    if(sortedNumbers[y] != sortedNumbers[y - 1] - 1)
                    {
                        output = output + " - " + sortedNumbers[y];
                        //Check if at end of array
                        if(y != sortedNumbers.Length)
                        {
                            x = y; //Keep going
                            break;
                        }
                        else
                        {
                            output.Remove(0, 2);
                            return output;
                        }
                    }
                }
            }
            //if no incrementing value is found add number to input
            else
            {
                output = output + ", " + sortedNumbers[x].ToString();
            }
    }

    //Each addition to the string adds ", " to beginning, remove the first one, and return value
    return output.Remove(0, 2);
}

这是我必须使用的:

该功能应该转为:

  

892,893,894,895,906,920,845

To This:

  

845,892 - 895,906,910

这是为了获取额外信息而执行的方式:

    public static void Main(string[] args)
    {
        int[] input = {892, 893, 894, 895, 906, 845};
        Console.WriteLine(FormatReceiptNumbers(input));
        Console.ReadLine();
    }

然而,在执行时,它会返回:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at Rextester.Program.FormatReceiptNumbers(Int32[] numbers)
   at Rextester.Program.Main(String[] args)

注意:我正在使用在线编译器来解释Rextester我很确定这不是问题的原因。

如果有人能帮我理解问题的原因,我将不胜感激。我没有看到x(或y?)如何超出界限,因为我已经设置了数组长度的限制。提前谢谢!

3 个答案:

答案 0 :(得分:1)

问题在于这一行:

if (x > 0 & sortedNumbers[x] == sortedNumbers[x - 1] - 1)

您应该使用 and符号&&(即逻辑 and)而不是 and签署&二进制 and

x = 0时,您拥有sortedNumbers[-1],使数组具有越界索引 - &gt;如果您使用&代替&&,则仍会执行此操作并且不会进行排序。

答案 1 :(得分:1)

这是因为你正在使用的条件(if(x > 0 & sortedNumbers[x] == sortedNumbers[x - 1] - 1))。即使&&&都用于比较,比较中的&也会始终评估第二个条件,而&&不会评估第二个条件第一个条件评估为false。

它应该是这样的:

 if (x > 0 && sortedNumbers[x] == sortedNumbers[x - 1] - 1)

答案 2 :(得分:1)

如果您需要它。 :)

static void Main(string[] args)
{
    int[] input = { 892, 893, 894, 895, 906, 920, 845 };
    string output = FormatReceiptNumber(input);
    Console.WriteLine(output);
    Console.ReadKey();
}

private static string FormatReceiptNumber(int[] numbers)
{
    Array.Sort(numbers);
    string output = "";
    for (int loop = 0; loop < numbers.Length - 1; loop++)
    {
        int? start = null, end = null;
        while (numbers[loop + 1] - numbers[loop] == 1)
        {
            if (start == null)
            {
                start = numbers[loop];
            }
            end = numbers[loop + 1];
            loop++;
        }
        if (start != null && end != null)
        {
            output += start + "-" + end + ", ";
        }
        else
        {
            output += numbers[loop].ToString() + ", ";
        }
    }
    output += numbers[numbers.Length - 1].ToString();
    return output;
}