索引超出了数组的范围.C#

时间:2017-06-07 07:42:58

标签: c# winforms

我有一个程序的一部分,它有生成代码的方法(HelmID),生成它,我从文本文件中读取以获取最新的HelmID。这是我的文本文件。

T001#C001#H001#FullFace#S001#
T001#C001#H002#FullFace#S002#

问题是,该方法不会生成H003(在H002之后)并且给出错误消息'索引超出了数组的界限'。这是我的方法代码。

public string newHelmetCode()
        {
            string Str, HelmetCode;
            int HelmetInt;
            string[] strArray = new string[5];
            if (new FileInfo("TransDetail.txt").Length == 0)
            {
                HelmetCode = "H001";
                return HelmetCode;
            }
            else
            {
                Str = File.ReadLines("TransDetail.txt").Last();
                strArray = Str.Split(new string[] { "#" }, StringSplitOptions.None);

                HelmetCode = strArray[2].Substring(1, 3);
                HelmetInt = Convert.ToInt32(HelmetCode) + 1;

                if (HelmetInt <= 9)
                {
                    HelmetCode = "H00" + HelmetInt.ToString();
                }
                else if (HelmetInt <= 99)
                {
                    HelmetCode = "H0" + HelmetInt.ToString();
                }
                else if (HelmetInt <= 999)
                {
                    HelmetCode = "H" + HelmetInt.ToString();
                }
                return HelmetCode;
            }
        }

错误来自此代码HelmetCode = strArray[2].Substring(1, 3);。它应该生成原因我使用Substring(并转换为int)来获取文本文件最后一行的最新数字。任何回复都会适用

2 个答案:

答案 0 :(得分:1)

也许在最后一行之后有一个换行符或类似的东西。您可以将LINQ用于唯一的relvant行:

var lineFields = File.ReadLines("TransDetail.txt")
    .Select(line => line.Split(new string[] { "#" }, StringSplitOptions.None))
    .Where(arr => arr.Length >= 5)
    .ToArray();

if(lineFields.Length > 0)
{
    string[] lastFields = lineFields.Last();
    int helmetInt;
    bool valid = int.TryParse(lastFields[2].Substring(1), out helmetInt);
    // check if it's valid otherwise log/throw error

    // you dont need the if...else if...else if... part, this is enough: 
    string helmetCode = "H" + helmetInt.ToString("D3");
    // ...
}

答案 1 :(得分:0)

显然,fun <T> mutableReplicate(n:Int, x:T) : MutableList<T>{ val xs = mutableListOf<T>() for (i in 1..n){ xs.add(x) } return xs } 中的项目少于三个。

你应该先查看长度。 (我的猜测是最后一行是空行btw):

strArray

您还应该检查所需字符串的长度if (strArray.Length >= 3) { // do } ,因为在Substring时,您将获得length < 1

所以检查长度:

ArgumentOutOfRangeException