首页 > 解决方案 > 索引超出 C# 控制台应用程序中数组错误的范围

问题描述

可能已经有类似的问题了,但我想我这里有一个具体案例

我正在尝试了解现有应用程序的工作方式并立即对其进行调试

这是一个控制台应用程序,我提供了 6 个参数:

  1. 职位名称
  2. 布尔标志
  3. 文件位置
  4. 文件类型
  5. 日期
  6. 文件应用程序 ID

我通过项目的“调试”部分下的命令行参数值提供参数列表

所以,它看起来像这样:"MyJobName" "0" "C:\\MyFile.txt" "MyFileType" "20200318" "MyAppID"

应用程序具有以下逻辑:

SortedList<string, string> L = new SortedList<string,string>();                

for (int i = 2; i <= args.GetLength(0) - 1; i++)
{
     L.Add(args[i].Split(':')[0], args[i].Split(':')[1]);
}

List<SqlParameter> p = new List<SqlParameter>();
p.Add(new SqlParameter("@JobName", args[0]));
string xmlResult = D.RunProcedureXmlString("SPU_GetJobInfo", p);

因此,当我在第一次迭代中点击循环内的行时,会发生以下运行时错误:

args[i].Split(':')[1]   'args[i].Split(':')[1]' threw an exception of type 'System.IndexOutOfRangeException'    string {System.IndexOutOfRangeException}

现有逻辑有什么问题,解决办法是什么?

我不确定修复是否会破坏我之前猜测的工作。以后需要测试一下。

标签: c#console-applicationindexoutofrangeexception

解决方案


如果args数组中的一项中没有:字符,则调用Split(':')将返回一个只有一项的数组。因此,调用args[i].Split(':')[1]将抛出一个IndexOutOfRangeException.

此外,您应该只调用Split一次,这样您就可以重新使用结果数组,而不是浪费循环和内存多次调用它。

解决此问题的一种方法是首先检查拆分字符串的结果是否具有所需数量的部分:

for (int i = 2; i < args.GetLength(0); i++)
{
    var result = args[i].Split(':');
   
    if (result.Length < 2)
    {
        // Do something here if there aren't enough items
    }
    else
    {
        L.Add(result[0], result[1]);
    }
}

如果没有足够的项目,或者使用默认值:

for (int i = 2; i <= args.GetLength(0) - 1; i++)
{
    var result = args[i].Split(':');
    var firstPart = result[0];
    var secondPart = result.Length > 1 ? result[1] : string.Empty; // Default value

    L.Add(firstPart, secondPart);
}

推荐阅读