如何在C#中解析字符串以提取键值对,而键和值之间没有任何定界符?
我有一个看起来像这样的字符串
string[] properties = ["FIRSTNAMEJOHN","LASTNAMESMITH", etc.]
在\ n分割后,我得到了一个看起来像
的字符串集合Person person = new Person()
{ FIRSTNAME = JOHN,
LASTNAME = SMITH,
etc...
}
我想遍历这些字符串的拆分数组,并从每个单独的字符串中提取键值对,这样我就可以填充对象的属性,例如...
if (Stream.of(key1, key2, key3, key4).anyMatch(rqstCriteria::contains) ||
rqstCriteria.contains(key5) &&
anotherCriteria != null &&
Stream.of(key1, key2, key3, key4, key5).anyMatch(anotherCriteria::contains))
{}
最干净的方法是什么?谢谢!
答案 0 :(得分:4)
您可以创建一个具有这些属性的类,然后通过反射获取对象的属性(因此我们可以使用循环),在\n
字符上分割字符串,然后为每个属性分配每个设置(如果设置以属性名称开头),请根据其余设置字符串设置属性值。
例如:
class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string BirthDate { get; set; }
public override string ToString()
{
return $"{FirstName} {LastName}, born on {BirthDate}, lives at: {Address}";
}
}
public class Program
{
static void Main(string[] args)
{
string str = "\nFIRSTNAMEJOHN\nLASTNAMESMITH\nADDRESS1590 GRACE STREET\nBIRTHDATE04201969";
var user = new User();
var properties = typeof(User).GetProperties();
var settings = str.Split('\n');
foreach (var property in properties)
{
foreach (var setting in settings)
{
if (setting.StartsWith(property.Name, StringComparison.OrdinalIgnoreCase))
{
property.SetValue(user, setting.Substring(property.Name.Length));
break;
}
}
}
Console.WriteLine(user);
GetKeyFromUser("\n\nDone! Press any key to exit...");
}
}
输出