我有一个定义如下的对象:
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;
}
}我将这个对象放在一个列表中,这个列表需要被父类中的许多方法访问,如下所示:
public static List<Variable> variableList = new List<Variable>();我在一个文本文件上有一个输入,我正在使用.Split(",")以任何顺序和可能缺少的键值(除了名称)放入字符串数组中:
varName,Test,varVal,1.0101,varParam,3.03因此,在我的代码中,在使用.Split(",")作为文本行之后:
string readKeyvalue[] = { "varName","Test","varVal","1.0101","varParam","3.03" }我必须强调,文本文件中只需要varName密钥对,并且所有这些密钥对都可以是任意顺序的。我想把它们放到如下结构的对象属性中(伪代码):
variableList[0].varName == Test
variableList[0].varVal == 1.0101
variableList[0].varParam == 3.03我之前的努力失败了,我通过对数组进行排序(这是可行的),并在my previous question中使用了以下可以引用的内容。此行用于缺少varVal的情况,但已排序到varName,Test,varParam,3.03的字符串数组中:
materialList.Add(new Material(sortedVals[1]) { $sortedVals[2] = Convert.ToDouble(sortedVals[3]) } ) ;正如您所看到的,这是不起作用的,因为sortedVals[2]没有被编译器识别为成员声明符,并且我找不到方法(没有另外2-3个仅用于将字符串转换为属性的类,然后蛮横地强迫我通过大量代码)将所有可用值分配给属性,同时跳过缺少的值。
所以为了澄清,我找不到一种方法来将可用的属性分配给一个对象,同时忽略任何缺少的对象,而不是在每种情况下都进行硬编码(当我有一个具有10-12个属性的对象时,这将是非常困难的)。
如果任何人有任何智慧,我将不胜感激!
发布于 2020-05-13 23:28:54
因此,如果我理解您的问题,一种方法是将输入字符串解析到字典中。如下所示:
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分组,该索引将被截断,因为它是整数除法)。在那里,您可以将这些对转换为数组(包含两个值),然后转换为一个字典,该字典以每个对的第一个值为关键字。
然后,您可以使用数据库键来填充您的对象,测试它们的存在:
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,但您可能希望以不同的方式处理它。
https://stackoverflow.com/questions/61778008
复制相似问题