强制在自定义设置文件上使用Linq,但无法弄明白

时间:2014-05-07 11:39:46

标签: c# linq

我们有一个自定义.settings文件,我们用它来存储在某些情况下定义的变量和自定义操作。

基本上我们所拥有的只是一种格式,无法读取它。我确实提出了一个想法,但很快被拒绝了,我被告知我们必须使用Linq"。

现在我坐在这里想知道我将如何做到这一点。我们的文件看起来像这样:

[SET Name:"NeverAcquireRemoteFiles" Value:"False"]
[SET Name:"CheckForUpdates" Value:"True"]
[SET Name:"" Value:""]
[SET Name:"" Value:""]

[PERFORM Action:"AcquireRemoteFiles" When:"ApplicationWindowShown"]
[PERFORM Action:"CheckForUpdates" When:""]
[PERFORM Action:"" When:""]
[PERFORM Action:"" When:""]
[PERFORM Action:"" When:""]
[PERFORM Action:"" When:""]
[PERFORM Action:"" When:""]
[PERFORM Action:"" When:""]

请注意空行,他们只是在那里证明此文件中没有特定数量的行,设置或操作。

老实说,我对Linq的了解不足以解决这个问题(不需要多花点时间),我只是不知道如何针对这个文件编写查询。

SET开头的行是变量。 Name属性表示变量的名称,而Value表示它的值(duh)。以PERFORM开头的行是动作。我想你知道其他的。

基本上,我们有一些"阶段"在我们的应用程序中,我们可能需要或不需要做某些事情。并且这些不一定是可以100%准确自动化的事情。我们需要100%的准确性。因此,设置文件的想法。根据条件和当前情况,我们在启动应用程序之前修改或删除或添加到设置文件。

是否可以使用Linq读取此文件,如果是,如何?

1 个答案:

答案 0 :(得分:4)

我建议您使用正则表达式来解析配置文件中的行。例如。获取变量设置将如下所示:

var regex = new Regex(@"\[SET Name:""(?<name>\w+)"" Value:""(?<value>\w*)""\]");

var variables = File.ReadLines("legacy.config")
                    .Select(l => regex.Match(l))
                    .Where(m => m.Success)
                    .Select(m => new {
                        Name = m.Groups["name"].Value,
                        Value = m.Groups["value"].Value
                    }).ToArray();

或查询语法

var variables = from l in File.ReadLines("legacy.config")
                let m = regex.Match(l)
                where m.Success
                select new {
                    Name = m.Groups["name"].Value,
                    Value = m.Groups["value"].Value
                };

输出:

{ Name = "NeverAcquireRemoteFiles", Value = "False" }
{ Name = "CheckForUpdates", Value = "True" }

花一些时间,采用相同的方法解析动作设置。