Могу ли я переписать этот LINQ в XML лучше? - PullRequest
2 голосов
/ 04 марта 2010

Я только изучаю 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 ]

2 голосов
/ 04 марта 2010

Вы могли бы, вероятно, исключить среднюю часть, если разбили результаты на результаты поиска, то есть:

.
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.

Насколько это улучшение, зависит от того, что еще вы делаете с этой информацией, но она, по крайней мере, немного чище.

2 голосов
/ 04 марта 2010

лично я использую:

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

если у вас есть имена (элементы), которые вы знаете, вы можете просто назвать их, и они будут возвращены. Это также экономит дополнительные циклы (по крайней мере, в вашем коде)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...