C#中的动态数组填充

时间:2016-05-06 13:22:38

标签: c# arrays

我想分享我目前正在研究的一种非常古怪的现象。从全球来讲,这项任务看起来微不足道,因为它是关于填充一些数组。但是经过多次调试我的代码,错误: 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;
    }
}

我重申: outpSourceDataSavePathcount=3i=0都正确,但问题开始了在行i=1中的以下增量SavePath处,即使对于后一种情况,前一个变量也是正确的(从调试模式)。

2 个答案:

答案 0 :(得分:4)

看起来outp被定义为1元素数组(因此,只有outp [0]有效)。如果我&gt; 0,您正在数组边界外访问,因此异常。同样适用于SavePath。

由于你想要一个元素数组,你可以

  1. 在while循环之外声明outp / Savepath,指定正确的元素数量(一旦声明,数组具有固定大小)
  2. 将它们声明为List而不是Array。 List可以通过[]运算符访问,但也支持允许它增长的.Add方法。
  3. 你可以选择像

    这样的东西
    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++;

由于outpSavePath只有1个元素,因此当您尝试在i > 0时对其进行索引时会出现异常。这并不清楚你到底想要做什么。如果您实际上不需要数组,那么只需使用一个字符串。所以它会变成:

string outp = "CS_" + FileNameFromPath[i];

string SavePath = DirOutputOlis + @"\" + outp;

或者,如果您打算存储outpSavePath的值,那么您需要在while循环之外定义一个集合:

string[] outp = new string[count];
string[] SavePath = new string[count];
// ...
while (i < count)
{
    outp[i] = "CS_" + FileNameFromPath[i];
    // ...
    SavePath[i] = DirOutputOlis + @"\" + outp[i];
    // ...
}