将数组中的字符串拆分为另一个数组,然后引用它们进行计算

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.LengthLength 给出数组中元素的总数:MSDN.

此外,我建议使用 for 循环而不是 while,如下所示:

for(int i = 0; i<lengths; i++)
{
    units[i]=Convert.ToDouble(lengths[i].Split(new Char[] { ',' })[1]);
}

希望对您有所帮助。