【问题标题】:Index was outside the bounds of the array.C#索引超出了数组的范围。C#
【发布时间】:2017-06-07 07:42:58
【问题描述】:

我有一部分程序具有生成代码 (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)来获取文本文件最后一行的最新数字。任何回复都会适用

【问题讨论】:

  • 最后一行之后是否有换行符?
  • 语句Str = File.ReadLines("TransDetail.txt").Last();之后的'Str'的内容是什么?
  • 请调试代码并确保错误来自 HelmetCode = strArray[2].Substring(1, 3);。确保文本文件中的最后一行不为空
  • 顺便说一句,你不需要if...else if...else if... 部分,这就足够了:HelmetCode = "H" + HelmetInt.ToString("D3")
  • 感谢 user2960398 和 Romano Zumbe,在 H002 之后有一个空行,因为我在流写入器上使用 writeline,导致出现空行

标签: c# winforms


【解决方案1】:

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

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");
    // ...
}

【讨论】:

    【解决方案2】:

    显然strArray 中的项目少于三个。

    您应该先检查长度。 (我的猜测是最后一行是一个空行顺便说一句):

    if (strArray.Length >= 3)
    {
        // do
    }
    

    你还应该检查你想要Substring的字符串的长度,因为当length &lt; 1时,你会得到一个ArgumentOutOfRangeException

    所以检查长度:

    string test = strArray[2];
    
    if (test.Length > 1)
    {
        // do
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多