C#引用数组赋值问题

时间:2016-09-06 11:42:06

标签: c# arrays

我在从数据库中读取值并将它们分配给数组时遇到了一些麻烦。它似乎适用于我的单元测试,但实际上缺少一些值。

这是我的数据库代码:

private void GetParameterValuesFromDatabase()
{
        this.parameterValues = (from DataRow r in this.database.RunCommand("select * from KST_PARAM_VALUES v join DM_PARM_NAME p on v.PARM_NAME_KEY = p.PARM_NAME_KEY").Rows
                                where (int)r["SCENARIO_KEY"] == this.scenario.ScenarioKey
                                select new DatabaseParameter
                                {
                                    ParameterValuesKey = r.Field<int>(0),
                                    ProfileType = r.Field<string>(1),
                                    ScenarioKey = r.Field<int>(2),
                                    StressEditorKey = r.Field<int>(3),
                                    StressClassKey = r.Field<int>(4),
                                    PeriodKey = r.Field<int>(5),
                                    ParameterNameKey = r.Field<int>(6),
                                    ParameterValue = r.Field<double>(7),
                                    ActiveStress = (r.Field<string>(8) == "Y") ? true : false,
                                    ParameterKey = (int)r["PARM_NUMBER"]
                                }).ToDictionary(r => r.ParameterValuesKey, r => r);
    }   

我的代码的这部分没有任何问题,只是显示完整性。

private void LoadParameters()
{
    this.GetParameterValuesFromDatabase();

    // TODO: Assuming 9 periods for now, change to allow for variable periods
    for (int i = 1; i <= MaxNumberOfStressPeriods; i++)
    {
        this.parametersByPeriod.Add(i, this.parameterValues.Where(t => t.Value.PeriodKey == i).ToDictionary(t => t.Key, t => t.Value));
    }

    Log.Instance.LogMessage(LogLevel.Debug, "Created parameter dictionaries from database");

    // For every stress editor in the dictionary of stress editors
    foreach (KeyValuePair<int, ClassList> ed in this.stressParams)
    {
            // For every type of class selector
            foreach (ClassSelector c in Enum.GetValues(typeof(ClassSelector)))
            {
                // For each of the classes within each class list within the editor
                for (int i = 0; i < ed.Value.ClassLists[c].Count; i++)
                {
                    string className = ed.Value.ClassLists[c][i].Name;

                // For each double array in each class
                    foreach (KeyValuePair<int, double[]> t in ed.Value.ClassLists[c][i].ClassVariables.EditorParameters)
                    {
                        double[] values = this.GetParameterValues(t.Key, ed.Key, className);

                        BasicStressEditorVariables.AddParameters(values, ed.Value, className, t.Key);
                    }
                }
            }
        }
    }
}

上面显示了整体LoadParameters()方法。 下面我们有一些代码从数据库构造的字典中选择9个值,准备添加到数组中。

 private double[] GetParameterValues(int paramKey, int editorKey, string className)
 {
     double[] values = new double[9];

     for (int i = 1; i <= MaxNumberOfStressPeriods; i++)
     {
         Dictionary<int, DatabaseParameter> temp = this.parametersByPeriod[i];

         foreach (KeyValuePair<int, DatabaseParameter> d in temp)
         {
             if (d.Value.ParameterKey == paramKey && d.Value.PeriodKey == i && d.Value.StressEditorKey == editorKey && d.Value.ProfileType == className)
             {
                 values[i - 1] = d.Value.ParameterValue;
             }
         }
     }

     return values;
 }

下面显示从字典中获取目标数组,因为索引不能通过引用传递

 public static void AddParameters(double[] values, ClassList editor, string className, int paramKey)
 {
     // TODO: Maybe search all lists to eliminate the need for the class selector as a parameter
     // TODO: Will throw an exception when nothing is found. Handle it
     ParameterClass p = null; 

     foreach (ClassSelector c in Enum.GetValues(typeof(ClassSelector)))
     {
        p = editor.ClassLists[c].FirstOrDefault(f => f.Name == className);

         if (p != null)
         {
                break;
         }                
     }
     // TODO: Notify that could not be found
     if (p == null)
     {
         Log.Instance.LogMessage(LogLevel.Error, $"Unable to find class {className}");
         return;
     }

     double[] dest = p.ClassVariables.editorParameters[paramKey];

     AddParameterValues(values, ref dest);   
 }

这是AddParameterValues()方法:

private static void AddParameterValues(double[] values, ref double[] destination)
{
    if (values.Length != destination.Length)
    {
        return;
    }

    for (int i = 0; i < values.Length; i++)
    {
        destination[i] = values[i];
    }
}

调试显示某些值正在加载到目标数组中,但有些值未加载到目标数组中。谁能告诉我为什么会这样?或者,如果没有,请指向一些材料?

感谢您的时间

1 个答案:

答案 0 :(得分:0)

我不是C#专家,而是希望将代码作为C程序员

private double[] GetParameterValues(int paramKey, int editorKey, string className)
{
    double[] values = new double[9];
    //...    
    return values;
}

我认为的生命周期仅在函数 GetParameterValues 内,而函数 GetParameterValues 会在参考死亡时传递调用者变量。 如果您将原型更改为

,该怎么办?
private void GetParameterValues(ref double[] values, int paramKey, int editorKey, string className)