数组索引超出范围错误C#

时间:2012-11-12 19:35:16

标签: c# .net arrays

我有这个代码,我得到错误,并且无法理解为什么我得到错误。代码如下:im使用两个数组一个字符串和一个double(数据值及其相应的tinestamp)。但由于某些原因,我得到的错误是:在这一行索引越界错误:

     getSelectedItemsObj.arrayOfTimeStamp        = GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp;

如果我删除此行并仅使用arrayOfValue代码正常,但我需要两者

..........感谢快速回复,以下是如何设置GetItemData

 public CustomDataType GetItemData(string parameterName, string fromTime, string toTime)
    {

        getWeatherItemObj = new CustomDataType();
        // get the parameter ID
        prameterID = GetParameterInfo(parameterName).ParameterID; 
        //get the nr of items to size value arrays
        tableSize = GetTableSize(parameterName, fromTime, toTime, prameterID);
        getWeatherItemObj.arrayOfValue      = new double[tableSize];            
        getWeatherItemObj.arrayOfTimeStamp  = new string[tableSize];
        counter = 0;
        try
        {
            using (conn = new SqlConnection(connectionString))// create and open a connection object
            {
                // 1. create a command object identifying the stored procedure
                 cmd = new SqlCommand("GetItemData", conn);
                // 2.Let the command object know we will execute a stored procedure
                cmd.CommandType = CommandType.StoredProcedure;
                // 3. add the 3 parameters to command, so the can be passed to the stored procedure                  
                cmd.Parameters.Add("@ParameterName", SqlDbType.VarChar).Value    = parameterName;
                cmd.Parameters.Add("@FromTime", SqlDbType.VarChar).Value                = fromTime;
                cmd.Parameters.Add("@ToTime", SqlDbType.VarChar).Value                  = toTime;
                //open connection
                conn.Open();
                // execute the command
                reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        getWeatherItemObj.arrayOfValue[counter]         = (double)reader["MeasurementValue"];
                        getWeatherItemObj.arrayOfTimeStamp[counter]     = reader["MeasurementDateTime"].ToString();                          
                        counter++;
                    }
                } 
                //close connection
                reader.Close();            
            }
        }
        catch (SqlException e)
        {
            Console.WriteLine("Connection failed");
            Console.WriteLine(e.Message);
            Thread.Sleep(5000);
        }           
        return getWeatherItemObj;
    }






 class CustomDataType
{
    public double[] arrayOfValue;
    public string[] arrayOfTimeStamp;

}

public CustomDataType GetSelectedtemsData(string[] parameterName, string fromTime, string toTime)
    {
        numberOfParameters = parameterName.Length;//Get the number of given parameters
        tableSize = 0;
        for (counter = 0; counter < numberOfParameters; counter++)
        {
            tableSize = tableSize + GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp.Length;               
        }

        getSelectedItemsObj = new CustomDataType();

        getSelectedItemsObj.arrayOfValue        = new double[tableSize];
        getSelectedItemsObj.arrayOfTimeStamp    = new string[tableSize];
        for (counter = 0; counter < tableSize; counter++)
        { 
            getSelectedItemsObj.arrayOfValue            = GetItemData(parameterName[counter], fromTime, toTime).arrayOfValue;
            getSelectedItemsObj.arrayOfTimeStamp        = GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp;

        }
        return getSelectedItemsObj;
    }

3 个答案:

答案 0 :(得分:2)

问题在于你如何对待你的柜台。如果你删除时间戳的东西,计数器永远不会真正被修改,所以它似乎都可以工作,但如果你有时间戳的东西,那么你的for循环初始化器看起来像这样:

for (counter = 0; counter < tableSize; counter++)

tableSize最终大于parameterName[].Length。由于后来你正在调用parameterName[counter],因此计数器将超出范围。您需要确保您永远不会尝试通过在该数组中不合法的索引访问parameterName[]中的内容。

编辑:
另一种可能性,如果删除该行删除错误,则返回

GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp;

大于

中指定的指定数组
getSelectedItemsObj.arrayOfTimeStamp    = new string[tableSize];

为了做出这样的决定,您还需要将代码发布到该方法。

答案 1 :(得分:2)

问题就在这里:

for (counter = 0; counter < tableSize; counter++)
{ 
     getSelectedItemsObj.arrayOfValue            = GetItemData(parameterName[counter], fromTime, toTime).arrayOfValue;
     getSelectedItemsObj.arrayOfTimeStamp        = GetItemData(parameterName[counter], fromTime, toTime).arrayOfTimeStamp;    
}

您的counter尺寸正在根据tableSize递增,但其使用方式与基于parameterName的尺寸相同。您的代码中没有任何内容强制执行此假设,因此只要tableSize大于parameterName,您就会收到错误。

答案 2 :(得分:1)

请尝试以下方法:

public CustomDataType GetSelectedtemsData(string[] parameterName, string fromTime, string toTime)
{
    CustomDataType tempObj;     // *Rename this variable*
    List<double> valueList = new List<double>();
    List<string> timeStampList = new List<string>();

    for (counter = 0; counter < parameterName.Length; counter++)
    {
        tempObj = GetItemData(parameterName[counter], fromTime, toTime);
        valueList.AddRange(tempObj.arrayOfValue);
        timeStampList.AddRange(tempObj.arrayOfTimeStamp);
    }

    getSelectedItemsObj = new CustomDataType();
    getSelectedItemsObj.arrayOfValue = valueList.ToArray();
    getSelectedItemsObj.arrayOfTimeStamp = timeStampList.ToArray();

    return getSelectedItemsObj;
}

我打算按照你的方式尝试,但是一旦我意识到你将每个parameterName拉3次,而第二个循环需要一个内部循环(因为你需要迭代每个GetItemData中的每个索引),那么无论如何,我的修复将导致相同数据的多个副本;我决定使用两个List来重建方法。

如果这不能解决您的问题,那么我将需要完整的错误消息,错误消息中的堆栈跟踪以及错误堆栈上最顶层方法的代码。

注意:还有许多额外的优化可能会对您有所帮助:

  • 您可能还希望更新GetItemData以使用List代替数组,以便跳过tableSize = GetTableSize(parameterName, fromTime, toTime, prameterID);行。
  • 您可能希望更改CustomDataType,因此arrayOfValuearrayOfTimeStamp不是数组。然后,您可以传递CustomDataType甚至CustomDataType[],而不是传递List<CustomDataType>