C#如何将变量用作键值字符串数组的对象列表对象构造函数中的属性名称

Posted

技术标签:

【中文标题】C#如何将变量用作键值字符串数组的对象列表对象构造函数中的属性名称【英文标题】:C# How to use variables as property names in an object List object constructor for key-value string arrays 【发布时间】: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 中)。

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

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

谢谢大家!

【问题讨论】:

【参考方案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()' 案例,写每个键的值案例!谢谢!

以上是关于C#如何将变量用作键值字符串数组的对象列表对象构造函数中的属性名称的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?

如何使用 C# 从字符串数组制作类似枚举的 Unity 检查器下拉菜单?

C# - 将对象列表转换为包含多个对象属性的数组

如何从对象数组中获取键值列表-JavaScript [重复]

redis的对象类型及其相应的编码类型

将 XML 字符串 API 响应转换为键值对象 C#