我有一个定义如下的对象:
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的对象时,这将非常困难属性)。
如果有人有什么智慧,我将非常感激!
因此,如果我了解您的问题,一种方法是将输入字符串解析为字典。像这样的东西:
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,但实际上您可能希望以不同的方式处理。