我想分享我目前正在研究的一种非常古怪的现象。从全球来讲,这项任务看起来微不足道,因为它是关于填充一些数组。但是经过多次调试我的代码,错误:
Index was outside the bounds of the array
看起来并不像看起来那么微不足道,我想知道我是否会错过一些东西。在发布该线程之前我已经犹豫了以避免任何潜在的downvotes,但说实话,这个错误对我来说真的很奇怪,因为从调试模式检索的所有已定义变量都符合我的期望。
举例说明:
int count = FileNameFromPath.Length;
int i = 0;
while (i < count)
{
try
{
string[] outp = new string[]
{
"CS_" + FileNameFromPath[i]
}
;
DataTable SourceData = GetDataTabletFromCSVFile(FileDirectory[i]);
string[] SavePath = new string[]
{
DirOutputOlis + @"\" + outp[i]
}
;
CreateCSVFileFromDataTable(SourceData, SavePath[i]);
Console.WriteLine("File Processed in Output Directory: {0}", outp[i]);
i++;
}
catch (InvalidOperationException exc)
{
using (StreamWriter writer = new StreamWriter(logPath, true))
{
writer.WriteLine("Message :" + exc.Message + "<br/>" + Environment.NewLine + "StackTrace :" + exc.StackTrace + "" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
}
Console.WriteLine("File not Processed to Directory: {0}", FileNameFromPath);
PrintException(exc);
Console.WriteLine("--------------------------------------------------------------------------------\n");
goto Exitx;
}
}
我重申: outp
,SourceData
,SavePath
,count=3
对i=0
都正确,但问题开始了在行i=1
中的以下增量SavePath
处,即使对于后一种情况,前一个变量也是正确的(从调试模式)。
答案 0 :(得分:4)
看起来outp被定义为1元素数组(因此,只有outp [0]有效)。如果我&gt; 0,您正在数组边界外访问,因此异常。同样适用于SavePath。
由于你想要一个元素数组,你可以
你可以选择像
这样的东西List<string> outp = new List<string>();
List<string> SavePath = new List<string>();
for (int i = 0; i < FileNameFromPath.Length; ++i)
{
outp.Add("CS_" + FileNameFromPath[i]);
SavePath.Add(DirOutputOlis + @"\" + outp[i]);
}
答案 1 :(得分:1)
在此处逐步查看代码,并想象使用i
的不同值时会发生什么:
// outp is an array with a *single* element
string[] outp = new string[]
{
"CS_" + FileNameFromPath[i]
};
DataTable SourceData = GetDataTabletFromCSVFile(FileDirectory[i]);
// SavePath is an array with a *single* element
string[] SavePath = new string[]
{
DirOutputOlis + @"\" + outp[i]
};
CreateCSVFileFromDataTable(SourceData, SavePath[i]);
Console.WriteLine("File Processed in Output Directory: {0}", outp[i]);
i++;
由于outp
和SavePath
只有1个元素,因此当您尝试在i > 0
时对其进行索引时会出现异常。这并不清楚你到底想要做什么。如果您实际上不需要数组,那么只需使用一个字符串。所以它会变成:
string outp = "CS_" + FileNameFromPath[i];
和
string SavePath = DirOutputOlis + @"\" + outp;
或者,如果您打算存储outp
和SavePath
的值,那么您需要在while循环之外定义一个集合:
string[] outp = new string[count];
string[] SavePath = new string[count];
// ...
while (i < count)
{
outp[i] = "CS_" + FileNameFromPath[i];
// ...
SavePath[i] = DirOutputOlis + @"\" + outp[i];
// ...
}