c# - 索引超出 C# 控制台应用程序中数组错误的范围
问题描述
可能已经有类似的问题了,但我想我这里有一个具体案例
我正在尝试了解现有应用程序的工作方式并立即对其进行调试
这是一个控制台应用程序,我提供了 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}
现有逻辑有什么问题,解决办法是什么?
我不确定修复是否会破坏我之前猜测的工作。以后需要测试一下。
解决方案
如果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);
}
推荐阅读
- react-native - 在 React-Native 当 Android 设备通过 USB 电缆断开连接时。表现出奇怪的行为
- android - OKHTTP 网络套接字库不工作?
- xml - 如何使用 VBScript 通过 ID 获取 XML 文件中的值?
- php - Symfony 2.1.11 图像数据响应在响应正文的开头添加了额外的字节
- php - 在 Symfony SwiftMailer 中翻译电子邮件的最佳实践
- r - 重现套索模拟实例1
- c# - C# ESC/POS 打印越南语
- c# - 根据另一列 SQL 格式化小数位数
- c# - 具有多个命名空间和命名空间前缀的 C# XML 反序列化
- python - 连接来自 UI 文件的信号