我真正重视这个社区的一件事就是学习用两行做事的方法,这两行通常需要20个.本着这种精神,我已经尽力将一些字符串解析从大约十几行到三行.但我觉得有人想告诉我这实际上是一团糟.仅仅为了我自己的启发,是否有更简洁的方法来做以下事情?这一切都可以在一条线上完成吗?
string getThis = "<add key=\"messageFilter\" value=\"";
string subStr = strFile.Substring(strFile.IndexOf(getThis) + getThis.Length);
string[] igPhrases = subStr.Substring(0, subStr.IndexOf(";\"")).Split(';');
Run Code Online (Sandbox Code Playgroud)
UPDATE
感谢您的快速回复!真正有用的例子和良好的建议与最低限度的snark.:)更少的线条与干净优雅不同,减少线条实际上可能会使代码变得更糟.
让我重新解释一下这个问题.
我有一个XML文档,其中包含以下行:<add key="messageFilter" value="Out of Office AutoReply;Automatic reply;"/>.此文档告诉我们的自动售票系统不会从主题行中包含这些短语的电子邮件创建票证.否则,我们会得到无限循环.
我正在开发一个小程序,它将列出已包含的短语,然后允许用户添加新短语.如果我们注意到新的自动回复消息开始在系统中循环,我们需要能够将该消息的语言添加到过滤器.
我对XML并没有太多的工作.我喜欢Sperske的解决方案,但我不知道如何让它变得动态.换句话说,我不能把价值放在我的代码中.我需要找到键"messageFilter",然后获取与该键相关的所有值.
我所做的工作,但似乎有点麻烦.是否有更简单的方法来获取关键值?并添加一个新的?
一个略有不同的衬垫(为便于阅读而分开):
System.Xml.Linq.XDocument
.Parse("<add key='messageFilter' value='AttrValue'/>")
.Root
.Attribute("value")
.Value
Run Code Online (Sandbox Code Playgroud)
输出:
AttrValue
Run Code Online (Sandbox Code Playgroud)
要解决更新的问题,您可以将所有<add>节点转换为字典(借用Pako的优秀答案,并使用稍长的字符串):
var keys = System.Xml.Linq.XDocument
.Parse("<keys><add key='messageFilter' value='AttrValue'/><add key='userFilter' value='AttrValueUser'/></keys>")
.Descendants("add")
.ToDictionary(r => r.Attribute("key").Value, r => r.Attribute("value").Value);
Run Code Online (Sandbox Code Playgroud)
这使您可以像这样访问您的密钥:
keys["messageFilter"] == "AttrValue"
keys["userFilter"] == "AttrValueUser"
Run Code Online (Sandbox Code Playgroud)