【发布时间】:2020-12-28 04:20:57
【问题描述】:
我有如下文件:
-- Name John Smith, PhD
[20,00] Title : Software Engineer
[20,00] Employee Id : 20307
[20,00] Level : 41
[20,00] Start Date : 04/21/2014
[20,00] Org : Security
每个文件都包含一个仅适用于 1 个人的条目。我需要从该文件中提取名称、标题和级别,然后创建并填充以下类的对象:
public class Person
{
public string Name { get; set; }
public string Title { get; set; }
public string Level { get; set; }
}
一种方法是创建一个需要匹配的字符串列表:
List<string> properties = new List<string> { "Name", "Title", "Level" };
然后逐行读取文件并尝试找到匹配的内容:
properties.Any(x => line.Contains(x))
如果我找到匹配项,我会进行一些字符串拆分和解析以获取我需要的值。但这将涉及大量的手工工作。有没有办法可以将字符串映射到类的变量并进行解析?
我的意思是这样的:
Person person = new Person();
Dictionary<string, Object> FieldToDataMember = new Dictionary<string, Object>()
{
{"Name", person.Name},
{"Title", person.Title},
{"Level", person.Level}
};
现在我逐行读取文件,如果它与其中一个键匹配,我进行解析并直接更新相应变量的值。这样,我不需要先查找是否有匹配项,然后再检查匹配的字符串以便能够将其放入正确的变量中。这样的事情可能吗?
感谢您的帮助。谢谢!
编辑:我还想退出循环(foreach(文件中的字符串行))并在找到我要查找的所有属性后停止进一步读取文件。
【问题讨论】:
-
您可以使用反射从字符串数组中找到字符串和属性名称,但它的性能不会很好。您对性能更感兴趣还是对代码行更少感兴趣?
-
行数更少,代码更简洁,但对性能没有太大影响。我不想以大量 if-else 循环结束。
-
您将这些字段定义为私有成员。您的意思是让它们改为公共属性吗?还是它们应该是私有字段?
-
对不起,他们应该是公开的。将更新问题。
标签: c# regex linq split pattern-matching