我试图了解为什么我的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);
}
答案 0 :(得分:1)
简短答案: 更改
productTable.Lenght - 2
至productTable.Lenght - 1
和
for (i = 0; i <= last_Postion; i++)
至for (i = 0; i < last_Postion; i++)
说明:
productTable.Lenght
给出了列表的长度,因此productTable.Lenght - 1
是列表中的最后位置(0
至productTable.Lenght - 1
)。
在for
内的while
内的“冒泡” i+1
循环中,对i
进行测试,因此last_position - 1
仅应上升到i == last_position
。
在您的代码中,当i + 1
时lastPosition
超出列表的最后位置。
注意:即使您进行了这些更改,我也没有检查您代码的有效性,
关于样式的注意事项,C#编码准则通常为变量名指定驼峰大小写,最好使用last_Position
而不是var
。您的代码中还有其他样式“错误”,例如使用类型而不是for
来声明函数顶部的变量。课程要求可能是其中一些“错误”,但是简短阅读任何编码约定文档(例如https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/inside-a-program/coding-conventions)对您来说都是有益的。大多数工作场所都有自己的编码准则或采用公开准则,但在所有准则上却非常相似。