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

时间:2015-04-17 21:50:44

标签: c# arrays split indexoutofboundsexception

我目前仍在学习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的数组。然后在“表单加载”部分中,我创建了一个循环,该循环将在每行中拆分字符串并将每个度量单位输出到列表框。这是必要的,以便当用户打开表单时,他们可以选择1到9之间的数字来引用每个度量单位。现在我在这里开始讨论我的问题。一旦用户按下计算按钮,在完成其他任何操作之前,我设置一个while循环来分割长度数组中的字符串,以获得每行中每个度量单位的数值,将每个值转换为double ,然后将此信息转储到名为units的新数组中。该程序的目的是让用户能够将测量单位转换为他们选择的不同测量单位。我希望能够使用来自第一个数组的split方法的名为units的数组中的数值进行计算。我知道我可以通过专门指示新数组上的索引,I.E。:单位[1]然后进行我的计算来做到这一点。现在,当我去运行该程序时,它总是挂起来说“索引超出了数组的范围”。我知道索引是指数组中的内存位置,所以索引不能大于数组,所以我不完全确定我做错了什么。我很可能忽略了一些简单的事情,但对于我的生活,我无法弄明白。有人可以帮助我,告诉我我做错了什么吗?如果我对如何实现目标完全错误,你能解释一下原因吗?对我的解释是我如何学得最好。再次感谢大家的帮助。

    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]);

        }

2 个答案:

答案 0 :(得分:3)

在C#索引中从0开始,所以假设你有一个包含10个项目的数组,length数组的第一个元素分别是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

编辑:

你必须得到这样的东西(这是没有经过测试的,而且我已经写好了#34;手工和#34;所以它可能包含一些拼写错误,但你会得到点< / p>

    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);
        }
    }

答案 1 :(得分:0)

您正在double[units]初始化btnConvert_Click,长度为0:

 int count = 0;
 double[] units = new double[count];

因此,当您尝试访问units[count-1] count值越来越低时,您会获得索引超出范围的异常,因为您尝试访问例如units[1],而不是# 39; t存在。尝试使用int count = lengths.LengthLength为您提供数组中元素的总数:MSDN

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

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

希望这有帮助。