我可以更好地将这个LINQ重写为XML吗?

时间:2010-03-04 01:47:57

标签: c# linq linq-to-xml

我只是在学习LINQ,特别是LINQ to XML,我写了一个有效的查询,但我想知道我是不是有点回合。代码可以改进吗?

我有一个XDocument:

<SomeDocument>
    <Prop1> val1 </Prop1>
    <Prop2> val2 </Prop2>
    <Prop3> val3 </Prop3>
</SomeDocument>

但Prop1,Prop2和Prop3可能不存在。可能还有其他XDocuments,我将用相同的代码解析,它们完全具有不同的属性。但是我只对XDocument感兴趣,如果它有Prop1或Prop1和Prop2。

var query = from n in xml.Elements()
                    where n.Name == "Prop1" || n.Name == "Prop2"
                    select new {n.Name, n.Value};

string prop1 = null;
string prop2 = null;

foreach (var n in query)
{
    if (n.Name == "Prop1") prop1 = n.Value;
    if (n.Name == "Prop2") prop2 = n.Value;
}

if (string.IsNullOrEmpty(prop1)) { //error } 
if (string.IsNullOrEmpty(prop2)) { DoMethod1(prop1); }
else { DoMethod2(prop1, prop2); }

查询后的代码对我来说似乎太长了,虽然我不确定是否有更好的方法来做我正在尝试做的事情。找到1或2个显式节点,并根据找到的节点(如果有)调用相关方法。

2 个答案:

答案 0 :(得分:2)

我亲自使用:

        var element = xml.Element("prop1");
        if (element!= null)
        {
            //The element exists, now do things on it!
            if(string.IsNullOrEmpty(element.Value)) {DoMe(element.Value);}
        }

如果您已经命名了您知道的属性(元素),则只需命名它们即可返回。这也节省了额外的循环(至少在你的代码中)

答案 1 :(得分:2)

如果将结果分解为查找,你可能会消除中间部分,即:

string[] propNames = new[] { "Prop1", "Prop2" };
var props = (from n in xml.Elements()
             where propNames.Contains(n.Name)
             select new { n.Name, n.Value })
            .ToLookup(e => e.Name, e => e.Value);

if (props.Contains("Prop1")) { ... }
if (props.Contains("Prop2")) { ... }
// etc.

这取决于你对这些信息做了什么改进,但至少它有点干净。