【问题标题】:C# How to use variables as property names in an object List object constructor for key-value string arraysC#如何将变量用作键值字符串数组的对象列表对象构造函数中的属性名称
【发布时间】:2020-08-28 18:39:45
【问题描述】:

背景:

我已经解析了导入到对象中的键值对。我这样做是因为我希望能够按逻辑易于使用的名称属性进行排序:

var varDupe = variableList.GroupBy(v => v.varName).Where(vName => vName.Count() > 1).Select(vName => vName.Key);

我在这些和字典列表之间进行了辩论,但最后似乎搜索更容易,因为我不需要导出这些键值对,只需对它们进行错误检查。对于我的一些对象列表,我将需要很多依赖项,例如“如果存在属性 Q,则需要属性 X、Y 和 Z”,并一次搜索所有不同的对象。如果我最好提供字典列表,请告诉我。

我的代码现在可以完美地使用正确排序的键值对,但作为键值对,它们本质上不需要按正确的顺序分组。我为我解析的键值字符串数组做了一个排序函数

问题

该函数对字符串数组进行排序,但是当我缺少键时问题就来了(例如,如果 varVal 是可选的)。 varVal 和 varParam 应该都是双精度的,所以我需要在对象中转换它们

假设我的字符串数组省略了一个可选参数。

varName,name1,varParam,1.01

“完整”数组如下所示:

varName,name1,varVal,3.9,varParam,1.01

我有这个代码来构建我的对象:

 switch (sortedVals.Count())
                {
                    case 2:
                        materialList.Add(new Variable(sortedVals[1]));
                        break;
                    // Example of what I am trying to do to use the key-values to identify the correct property to assign a value to
                    case 4:
                        materialList.Add(new Variable(sortedVals[1]) { sortedVals[2] = Convert.ToDouble(sortedVals[3]) } );
                        break;
                    // Example of how it works correctly if they are all in order
                    case 6:
                        materialList.Add(new Variable(sortedVals[1], Convert.ToDouble(sortedVals[3]), Convert.ToDouble(sortedVals[5]) ) );
                        break;
                    ...

如果您查看“案例 4”,我正在尝试使用字符串数组中的“键”来分配正确的“值”。我的变量类中的变量构造函数如下所示:

public Variable(string varName, double varVal = 1, double varParam = 0)

sortedVals[2] = "varParam" 

编译器无法识别我的变量旨在用作构造函数名称的字符串(即 varParam = Convert.ToDouble("1.01") 在案例 4 中)。

如何在构造函数中使用这样的字符串变量作为属性名?

我最好还是放弃对象并尝试制作字典列表并找到一种方法来搜索名称重复和其他属性?

谢谢大家!

【问题讨论】:

    标签: c# arrays list object


    【解决方案1】:

    有不同的方法来实现这一点:

    这是一个非常基本的解决方案,没有 linq 等,并假设您的拆分始终代表单个对象:

    string name; 
    double val = 1;
    double val2 = 0;
    for (int i = 0; i < sortedVals.length; i++)
    {
        string key = sortedVals[i];
        i++;
        string valString = sortedVals.length > i ? sortedVals[i] : string.Empty;
    
        switch (key) 
        {
             case "varName":
                 name = valString;
                 break;
             case "varVal":
                 val = valString != string.Empty ? double.Parse(valString) : val;
                 break;
             case "varParam":
                 val2 = valString != string.Empty ? double.Parse(valString) : val2;
                 break;
        }
    }
    materialList.Add(new Variable(name, val, val2));
    

    【讨论】:

    • 我在几个地方发布了这个问题(或变体),到目前为止,这是我见过的最优雅的解决方案,没有 linq 或神秘的字典分配/解析!我走错路了!而不是写 '.add()' 案例,写每个键的值案例!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2018-11-04
    • 1970-01-01
    • 2021-04-19
    • 2018-06-11
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多