首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态添加键,值解析数组放入Object.property =值模式

动态添加键,值解析数组放入Object.property =值模式
EN

Stack Overflow用户
提问于 2020-05-13 23:01:36
回答 1查看 34关注 0票数 0

我有一个定义如下的对象:

代码语言:javascript
复制
public class Variable
{
    public string varName { get; set; }
    public double varVal { get; set; }
    public double varParam { get; set; }

    public Variable(string varName1, double varVal1 = 1, double varParam1 = 0)
    {
        varName = varName1;
        varVal = varVal1;
        varParam = varParam1;
    }
}

我将这个对象放在一个列表中,这个列表需要被父类中的许多方法访问,如下所示:

代码语言:javascript
复制
public static List<Variable> variableList = new List<Variable>();

我在一个文本文件上有一个输入,我正在使用.Split(",")以任何顺序和可能缺少的键值(除了名称)放入字符串数组中:

代码语言:javascript
复制
varName,Test,varVal,1.0101,varParam,3.03

因此,在我的代码中,在使用.Split(",")作为文本行之后:

代码语言:javascript
复制
string readKeyvalue[] = { "varName","Test","varVal","1.0101","varParam","3.03" }

我必须强调,文本文件中只需要varName密钥对,并且所有这些密钥对都可以是任意顺序的。我想把它们放到如下结构的对象属性中(伪代码):

代码语言:javascript
复制
variableList[0].varName == Test
variableList[0].varVal == 1.0101
variableList[0].varParam == 3.03

我之前的努力失败了,我通过对数组进行排序(这是可行的),并在my previous question中使用了以下可以引用的内容。此行用于缺少varVal的情况,但已排序到varName,Test,varParam,3.03的字符串数组中:

代码语言:javascript
复制
materialList.Add(new Material(sortedVals[1]) { $sortedVals[2] = Convert.ToDouble(sortedVals[3]) } ) ;

正如您所看到的,这是不起作用的,因为sortedVals[2]没有被编译器识别为成员声明符,并且我找不到方法(没有另外2-3个仅用于将字符串转换为属性的类,然后蛮横地强迫我通过大量代码)将所有可用值分配给属性,同时跳过缺少的值。

所以为了澄清,我找不到一种方法来将可用的属性分配给一个对象,同时忽略任何缺少的对象,而不是在每种情况下都进行硬编码(当我有一个具有10-12个属性的对象时,这将是非常困难的)。

如果任何人有任何智慧,我将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-13 23:28:54

因此,如果我理解您的问题,一种方法是将输入字符串解析到字典中。如下所示:

代码语言:javascript
复制
var input = "varName,Test,varVal,1.0101,varParam,3.03";

var grouped = input.Split(',').Select((str,idx) => new {str, idx})
    .GroupBy(g => g.idx / 2)
    .Select(g => g.Select(s => s.str).ToArray());
Console.WriteLine(grouped.First().ToString());
var dictionary = grouped.ToDictionary(g => g[0], k => k[1]);

其思想是拆分字符串,然后将其分组为成对的值(按索引/2分组,该索引将被截断,因为它是整数除法)。在那里,您可以将这些对转换为数组(包含两个值),然后转换为一个字典,该字典以每个对的第一个值为关键字。

然后,您可以使用数据库键来填充您的对象,测试它们的存在:

代码语言:javascript
复制
variableList[0].varName = dictionary.TryGetValue("varName", out var s) ? s : null;
variableList[0].varVal = dictionary.TryGetValue("varVal", out var s) ? double.TryParse(s, out var d) ? d : 0.0 : 0.0;
variableList[0].varParam = dictionary.TryGetValue("varParam", out var s) ? double.TryParse(s, out var d) ? d : 0.0;

我使用了double.TryParse,如果字符串格式不正确,则回退到0,但您可能希望以不同的方式处理它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61778008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档