c#数组 - 索引超出范围异常

时间:2011-10-24 17:49:51

标签: c# arrays

我正在获取indexoutofrangeexception(请参阅下面代码中生成错误的行的---->指针)。该程序循环遍历数据集表中的标题和行项记录。表格有关系。我的示例数据有2个标题,每个标题有2行。 progam有两个循环,第一个循环遍历标题记录,第二个循环遍历标题的子记录。

该计划的一部分:

     // ***** PO Header and Line 

        int ln;
        ln = 0;

        // Create an eConnect PO Header node object
        taGLTransactionHeaderInsert jeh = new taGLTransactionHeaderInsert();

        // Create an array for lineitems
        taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new   taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln];

        foreach (DataRow dtrHDR in ds.Tables["Header"].Rows)

        {
            Array.Clear(lineitems, 0, ln);

            jeh.BACHNUMB = "Sheraz";
            jeh.JRNENTRY = jenoint;
            jeh.REFRENCE = dtrHDR["Reference"].ToString();
            jeh.SOURCDOC = dtrHDR["AvantisJE"].ToString();
            jeh.USERID = System.Environment.UserName;
            jeh.TRXDATE = System.DateTime.Now.ToString();

            ln = 0;

            foreach (DataRow dtrLine in dtrHDR.GetChildRows("HdrLine"))

            {

                // Populate the elements of the taPoLIne_ItemsTaPOLine XML node
                taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert jel = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert();

                jel.BACHNUMB = jeh.BACHNUMB;
                jel.JRNENTRY = jeh.JRNENTRY;
                jel.ACTNUMST = dtrLine["GreatPlains"].ToString();
                jel.DEBITAMT = Convert.ToDecimal(dtrLine["Debit"].ToString());

                //Avantis Inv Trx Key
                jel.ORDOCNUM = dtrLine["AvantisJE_Line"].ToString();
                // Avantis GL Trx Type
                jel.ORTRXDESC = dtrLine["transactiontypename"].ToString();


                //Add POLine to an Array
                lineitems[ln] = jel;     ----------------> I get an error here!

                ln = ln + 1;

                Array.Resize(ref lineitems, ln + 1);

            }

        }

7 个答案:

答案 0 :(得分:2)

这是因为您创建了一个包含0个元素的数组,并尝试在位置0上插入一个元素。这不起作用。您可以通过声明大小为1的数组来开始修复它:

// Create an array for lineitems
taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new   taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[1];

但是,动态调整数组大小并不是惯用的.NET方式。您可以使用List<T>来处理为您调整大小的问题,并为您提供更清晰的代码以及可能更好的性能。

答案 1 :(得分:2)

您正在访问尚不存在的索引。

//Add POLine to an Array
lineitems[ln] = jel;     ----------------> I get an error here!
ln = ln + 1;     
Array.Resize(ref lineitems, ln + 1);

您需要将订单更改为:

//Add POLine to an Array
Array.Resize(ref lineitems, ln + 1);
lineitems[ln] = jel;     ----------------> should be fixed, no error here!
ln = ln + 1;     

编辑:既然问题已经解决了,那就是更好的实施。

数组是固定大小的,调整数组大小是一项昂贵的操作(基本上它需要创建一个新大小的副本)。通常你会在识别出性能瓶颈后使用它们。在大多数情况下,使用List会好得多。

我建议更改此行:

// Create an array for lineitems
taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = 
              new    taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln];

为:

var lineitems = new  List<taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert>();

然后添加到它你只需

lineitems.Add(jel);

迭代它们将是:

for (var ln in lineitems) {
 // whatever you want to do with a line.
}

按索引访问特定项目将是:

lineitems.Item(i); // get the ith item in the list.

答案 2 :(得分:0)

您似乎试图通过设置值来增加数组的大小,就像在JavaScript中一样。 C#数组不是那样的。您需要以完成后希望它们的大小创建它们。

或者,您可以使用List对象,使用Add()方法将新内容放入列表中。

答案 3 :(得分:0)

lineitems显然与dtrHDR.GetChildRows("HdrLine")返回的行集合的大小不同。您正在创建一个零元素数组,然后尝试索引它。如果您希望它与dtrHDR.GetChildRows("HdrLine")的大小相匹配,那么您需要先调用它并在获得计数后初始化数组。

为什么不使用List<T>而只是将项目推送到它上,而不是使用数组?无需担心IndexOutOfRange例外情况。

答案 4 :(得分:0)

您需要先将数组初始化,然后再将任何内容放入其中。首先打电话给.resize。

答案 5 :(得分:0)

这些行是问题

 int ln;
 ln = 0;

 // Create an array for lineitems
 taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new   taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln];

您创建0个元素的表。

答案 6 :(得分:0)

您的计划中有一个错误的错误:

    int ln = 0
    .
    .
    .
    taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new   taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln];
    .
    .
    .
    lineitems[ln] = jel;

您正在初始化一个包含0个元素的数组,然后尝试将第一个元素(element [0])设置为一个值。