为什么我的Bubblesort代码需要-结构后面的2。长度才能起作用?

时间:2019-01-28 01:58:20

标签: c#

我试图了解为什么我的productTable.Length必须为-2才能使Bubblesort代码正常工作。

我创建了两个int变量,Last_Position和i。我创建了一个名为temp的产品变量和一个名为swap的布尔值,并将其设置为false。然后,将Last_Position设置为等于productTable.Length-2。

这是我无法理解的地方,从我阅读的内容中可以看出。长度计算字符的数量并返回该数量,但是由于1在编程中算作0,所以必须-1才能使上限准确(例如1000 = 999),直到这一部分一直适用。

由于某些原因-程序针对以下代码运行时将抛出1错误:if (String.Compare(productTable[i].prodCode, productTable[i + 1].prodCode) > 0)并指出“ System.IndexOutOfRangeException:'索引超出了数组的边界。'“

当我将其设置为-2时,代码可以工作,但我想了解为什么。

    struct product
    {
        public string prodCode;
        public string description;
        public double price;
        public int quantity;
    }

    product[] productTable;

    public void loadData()
    {
        string path = "C:\\Users\\5004303\\Documents\\productFile.csv";
        int lineCount = File.ReadLines(path).Count();
        productTable = new product[lineCount];
        product currentProduct = new product();

        try
        {
            StreamReader sr = new StreamReader(path);

            string line;
            int currentArrayLocation = 0;

            while (!sr.EndOfStream)
            {
                line = sr.ReadLine();
                string[] fields = line.Split(',');
                currentProduct.prodCode = fields[0];
                currentProduct.description = fields[1];
                currentProduct.price = Convert.ToDouble(fields[2]);
                currentProduct.quantity = Convert.ToInt32(fields[3]);
                productTable[currentArrayLocation] = currentProduct;
                currentArrayLocation++;
            }
            sr.Close();
        }
        catch (FileNotFoundException)
        {
            MessageBox.Show("An error occured. Could not find file 'productFile.csv'.");
        }
    }

    public void listProducts()
    {
        int currentArrayLocation = 0;

        for (currentArrayLocation = 0; currentArrayLocation < productTable.Length; currentArrayLocation++)
        {
            ListViewItem lvi = new ListViewItem();
            lvi.Text = productTable[currentArrayLocation].prodCode;
            lvi.SubItems.Add(Convert.ToString(productTable[currentArrayLocation].description));
            lvi.SubItems.Add(Convert.ToString(productTable[currentArrayLocation].price));
            lvi.SubItems.Add(Convert.ToString(productTable[currentArrayLocation].quantity));
            lvProducts.Items.Add(lvi);
        }
    }

    public void bubbleSort()
    {
        int last_Postion, i;
        product temp;
        last_Postion = productTable.Length - 2;
        Boolean swap = false;

        do
        {
            swap = false;
            for (i = 0; i <= last_Postion; i++)
            {
                if (String.Compare(productTable[i].prodCode, productTable[i + 1].prodCode) > 0)
                {
                    temp = productTable[i];
                    productTable[i] = productTable[i + 1];
                    productTable[i + 1] = temp;
                    swap = true;
                }
            }
        }
        while (swap == true);
    }

1 个答案:

答案 0 :(得分:1)

简短答案: 更改

productTable.Lenght - 2productTable.Lenght - 1

for (i = 0; i <= last_Postion; i++)for (i = 0; i < last_Postion; i++)

说明:

productTable.Lenght给出了列表的长度,因此productTable.Lenght - 1是列表中的最后位置(0productTable.Lenght - 1)。

for内的while内的“冒泡” i+1循环中,对i进行测试,因此last_position - 1仅应上升到i == last_position

在您的代码中,当i + 1lastPosition超出列表的最后位置。

注意:即使您进行了这些更改,我也没有检查您代码的有效性,

关于样式的注意事项,C#编码准则通常为变量名指定驼峰大小写,最好使用last_Position而不是var。您的代码中还有其他样式“错误”,例如使用类型而不是for来声明函数顶部的变量。课程要求可能是其中一些“错误”,但是简短阅读任何编码约定文档(例如https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/inside-a-program/coding-conventions)对您来说都是有益的。大多数工作场所都有自己的编码准则或采用公开准则,但在所有准则上却非常相似。