将数组中的字符串拆分为另一个数组,然后引用它们进行计算
Splitting strings in an array to another array, and then refrenceing them for calculations
我目前仍在学习 C#,我需要一些帮助。所以我有一个文本文件,总共包含 9 行,如下所示:
inch,.083333
fathom,6
foot,1
furlong,660
kilometer,3281.5
meter,3.2815
mile,5280
rod,16.5
yard,3
我使用方法 "ReadAllLines" 创建了一个名为 lengths 的数组。然后在 "form load" 部分,我创建了一个循环,将字符串拆分成每一行并将每个度量单位输出到列表框。这是必要的,以便当用户打开表单时,他们可以 select 一个 1 - 9 的数字来引用每个度量单位。现在这是我开始遇到问题的地方。一旦用户按下计算按钮,在做任何其他事情之前,我设置了一个 while 循环来拆分长度数组中的字符串以获得每行中每个度量单位的数值,将每个值转换为双精度,然后将此信息转储到一个名为 units 的新数组中。该程序的目的是让用户能够将测量单位转换为他们 select 的不同测量单位。我希望能够使用来自第一个数组的 split 方法的名为 units 的数组中的数值进行计算。我知道我可以通过在新数组 I.E.: units[1] 上专门指示索引来做到这一点,然后进行我的计算。现在当我转到 运行 程序时,它总是挂断说 "Index was outside the bounds of the Array"。我知道索引指的是数组中的内存位置,所以索引不能大于数组,所以我不完全确定我做错了什么。我很可能忽略了一些简单的事情,但对于我的一生,我无法弄清楚。有人可以帮助我并告诉我我做错了什么吗?如果我实现目标的方式完全错误,您能解释一下原因吗?对我的解释是我如何学得最好。再次感谢大家的帮助。
private void SandC_Load(object sender, EventArgs e)
{
splitContainer1.Panel1Collapsed = false;
splitContainer1.Panel2Collapsed = true;
string[] lengths = File.ReadAllLines("Units.txt");
int count=0;
string[] unitName=new string[count];
while (!(count==10))
{
count++;
lbLengths.Items.Add(count+"."+" "+lengths[count-1].Split(new Char[]{','})[0]);
}
}
private void btnConvert_Click(object sender, EventArgs e)
{
string orginalunits = tborginalUnits.Text;
int orginalunits1;
string desiredunits = tbDesiredunits.Text;
int desiredunits1;
string lenghttoConvert = tbConvert.Text;
double lenghttoConvert1;
string[] lengths = File.ReadAllLines("Units.txt");
int count = 0;
double[] units = new double[count];
while (!(count == 10))
{
count++;
units[count-1]=Convert.ToDouble(lengths[count - 1].Split(new Char[] { ',' })[1]);
}
在 C# 中,索引从 0 开始,所以假设您有一个包含 10 个项目的数组,长度数组的第一个元素分别为 lengths[0]
,最后一个元素为 lengths[9]
,总共为 10数组中的项目。在您的 while 循环中,您将一直走到第 11 个元素 count == 10
,这实际上是 lengths[10]
抛出异常的地方。
这意味着 lengths.Length == 10
为真但最后一个元素是 lengths[9]
遍历数组的最佳方法是使用 foreach 循环或 for 循环,例如
foreach(string str in lengths)
{
//.. do something with the string
}
或
for(int i = 0; i < lengths.Length; i++)
{
string str = lengths[i];
//.. do something with the str
}
您的代码的另一个问题如下
int count = 0;
double[] units = new double[count];
您在这里所做的是有效地创建一个空的双精度数组,一个包含 0 个项目的数组。因此,尝试将值分配给 units[0]
或 units[1]
的代码将抛出相同的 ArgumentOutOfRangeException
编辑:
你必须得到这样的结果(这没有经过测试,我已经写了它 "by hand" 所以它可能包含一些拼写错误,但你会明白的
private string[] lengths;
private void SandC_Load(object sender, EventArgs e)
{
lengths = System.IO.File.ReadAllLines("Units.txt");
for (var i = 0; i < lengths.Length; i++)
{
var line = lengths[i];
var s = line.Split(',')[0];
var itemText = string.Format("{0}.{1}", i + 1, s);
}
}
private void btnConvert_Click(object sender, EventArgs e)
{
// you dont need to read those again you've stored the in the private field this.lengths
// string[] lengths = File.ReadAllLines("Units.txt");
var units = new double[lengths.Length];
for (var i = 0; i < lengths.Length; i++)
{
var line = lengths[i];
var s = line.Split(',')[1])
;
units[i] = Convert.ToDouble(s);
}
}
您正在 btnConvert_Click
中初始化 double[units]
,长度为 0:
int count = 0;
double[] units = new double[count];
因此,当您尝试访问 units[count-1]
并进一步向下增加 count
的值时,您会得到一个索引越界异常,因为您正在尝试访问例如 units[1]
,这不存在。尝试使用 int count = lengths.Length
,Length
给出数组中元素的总数:MSDN.
此外,我建议使用 for
循环而不是 while
,如下所示:
for(int i = 0; i<lengths; i++)
{
units[i]=Convert.ToDouble(lengths[i].Split(new Char[] { ',' })[1]);
}
希望对您有所帮助。
我目前仍在学习 C#,我需要一些帮助。所以我有一个文本文件,总共包含 9 行,如下所示:
inch,.083333
fathom,6
foot,1
furlong,660
kilometer,3281.5
meter,3.2815
mile,5280
rod,16.5
yard,3
我使用方法 "ReadAllLines" 创建了一个名为 lengths 的数组。然后在 "form load" 部分,我创建了一个循环,将字符串拆分成每一行并将每个度量单位输出到列表框。这是必要的,以便当用户打开表单时,他们可以 select 一个 1 - 9 的数字来引用每个度量单位。现在这是我开始遇到问题的地方。一旦用户按下计算按钮,在做任何其他事情之前,我设置了一个 while 循环来拆分长度数组中的字符串以获得每行中每个度量单位的数值,将每个值转换为双精度,然后将此信息转储到一个名为 units 的新数组中。该程序的目的是让用户能够将测量单位转换为他们 select 的不同测量单位。我希望能够使用来自第一个数组的 split 方法的名为 units 的数组中的数值进行计算。我知道我可以通过在新数组 I.E.: units[1] 上专门指示索引来做到这一点,然后进行我的计算。现在当我转到 运行 程序时,它总是挂断说 "Index was outside the bounds of the Array"。我知道索引指的是数组中的内存位置,所以索引不能大于数组,所以我不完全确定我做错了什么。我很可能忽略了一些简单的事情,但对于我的一生,我无法弄清楚。有人可以帮助我并告诉我我做错了什么吗?如果我实现目标的方式完全错误,您能解释一下原因吗?对我的解释是我如何学得最好。再次感谢大家的帮助。
private void SandC_Load(object sender, EventArgs e)
{
splitContainer1.Panel1Collapsed = false;
splitContainer1.Panel2Collapsed = true;
string[] lengths = File.ReadAllLines("Units.txt");
int count=0;
string[] unitName=new string[count];
while (!(count==10))
{
count++;
lbLengths.Items.Add(count+"."+" "+lengths[count-1].Split(new Char[]{','})[0]);
}
}
private void btnConvert_Click(object sender, EventArgs e)
{
string orginalunits = tborginalUnits.Text;
int orginalunits1;
string desiredunits = tbDesiredunits.Text;
int desiredunits1;
string lenghttoConvert = tbConvert.Text;
double lenghttoConvert1;
string[] lengths = File.ReadAllLines("Units.txt");
int count = 0;
double[] units = new double[count];
while (!(count == 10))
{
count++;
units[count-1]=Convert.ToDouble(lengths[count - 1].Split(new Char[] { ',' })[1]);
}
在 C# 中,索引从 0 开始,所以假设您有一个包含 10 个项目的数组,长度数组的第一个元素分别为 lengths[0]
,最后一个元素为 lengths[9]
,总共为 10数组中的项目。在您的 while 循环中,您将一直走到第 11 个元素 count == 10
,这实际上是 lengths[10]
抛出异常的地方。
这意味着 lengths.Length == 10
为真但最后一个元素是 lengths[9]
遍历数组的最佳方法是使用 foreach 循环或 for 循环,例如
foreach(string str in lengths)
{
//.. do something with the string
}
或
for(int i = 0; i < lengths.Length; i++)
{
string str = lengths[i];
//.. do something with the str
}
您的代码的另一个问题如下
int count = 0;
double[] units = new double[count];
您在这里所做的是有效地创建一个空的双精度数组,一个包含 0 个项目的数组。因此,尝试将值分配给 units[0]
或 units[1]
的代码将抛出相同的 ArgumentOutOfRangeException
编辑:
你必须得到这样的结果(这没有经过测试,我已经写了它 "by hand" 所以它可能包含一些拼写错误,但你会明白的
private string[] lengths;
private void SandC_Load(object sender, EventArgs e)
{
lengths = System.IO.File.ReadAllLines("Units.txt");
for (var i = 0; i < lengths.Length; i++)
{
var line = lengths[i];
var s = line.Split(',')[0];
var itemText = string.Format("{0}.{1}", i + 1, s);
}
}
private void btnConvert_Click(object sender, EventArgs e)
{
// you dont need to read those again you've stored the in the private field this.lengths
// string[] lengths = File.ReadAllLines("Units.txt");
var units = new double[lengths.Length];
for (var i = 0; i < lengths.Length; i++)
{
var line = lengths[i];
var s = line.Split(',')[1])
;
units[i] = Convert.ToDouble(s);
}
}
您正在 btnConvert_Click
中初始化 double[units]
,长度为 0:
int count = 0;
double[] units = new double[count];
因此,当您尝试访问 units[count-1]
并进一步向下增加 count
的值时,您会得到一个索引越界异常,因为您正在尝试访问例如 units[1]
,这不存在。尝试使用 int count = lengths.Length
,Length
给出数组中元素的总数:MSDN.
此外,我建议使用 for
循环而不是 while
,如下所示:
for(int i = 0; i<lengths; i++)
{
units[i]=Convert.ToDouble(lengths[i].Split(new Char[] { ',' })[1]);
}
希望对您有所帮助。