C#中的字符串解析

Bet*_*moo 5 c# string performance parsing

什么是以#的形式解析C#字符串的有效方法

"(params (abc 1.3)(sdc 2.0)(www 3.05)....)"
Run Code Online (Sandbox Code Playgroud)

到表单中的结构

struct Params
{
  double abc,sdc,www....;
}
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑结构总是有相同的参数(相同的名称,只有双打,在编译时已知)..但订单不被授予..一次只有一个结构..

Run*_* FS 2

根据您的完整语法,您有几个选择:如果它是一个非常简单的语法并且您不必测试其中的错误,您可以简单地使用以下内容(这会很快)

var input = "(params (abc 1.3)(sdc 2.0)(www 3.05)....)";
var tokens = input.Split('(');
var typeName = tokens[0];
//you'll need more than the type name (assembly/namespace) so I'll leave that to you
Type t = getStructFromType(typeName);
var obj = TypeDescriptor.CreateInstance(null, t, null, null);
for(var i = 1;i<tokens.Length;i++)
{
    var innerTokens = tokens[i].Trim(' ', ')').Split(' ');
    var fieldName = innerTokens[0];
    var value = Convert.ToDouble(innerTokens[1]);
    var field = t.GetField(fieldName);
    field.SetValue(obj, value);
}
Run Code Online (Sandbox Code Playgroud)

然而,这种简单的方法需要一个良好的一致性字符串,否则会出现错误。

如果语法有点复杂,例如嵌套 (),那么这种简单的方法将不起作用。

您可以尝试使用正则表达式,但这仍然需要相当简单的语法,因此如果您最终有复杂的语法,您最好的选择是真正的解析器。Irony很容易使用,因为您可以用简单的 c# 编写它(不过了解一些 BNF 是一个优势)。