2016-10-07 4 views
2

Может ли кто-нибудь сказать мне, если это правильно или если есть более быстрый/чистый способ сделать это?Оптимизация LinqToXml

//I load p as a xDoc so I can use linq to xml 
    XDocument myDoc = XDocument.Parse(p); 
    // retrieve each "Item" node except if orderedQuantity is 0 or name is "nullorderitem" 
    IEnumerable<XElement> orderedRes = from item in myDoc.Descendants("Item") 
             where ((double)item.Element("orderedQuantity") > 0 &&  item.Element("ResourceId").Name != "NULLOrderItem") 
             select item; 

    foreach (XElement xelem in orderedRes) 
    { 
     if(xelem.Element("Name").Value.ToLower() == "oneofmyvalueIneed" 
      || xelem.Element("Name").Value.ToLower() == "anotherone" 
      || xelem.Element("Name").Value.ToLower() == "yetanother") 
     { 
      FieldProperties elem = new FieldProperties(); 
      elem.Fieldname = xelem.Element("Name").Value; 
      elem.Fieldvalue = xelem.Element("OrderedQuantity").Value; 
      lElem.Add(elem); 
     } 
    } 

Зная, что lElem список FieldProperties и FieldProperties является класс вида:

FieldProperties 
string fieldname 
string fieldvalue 

и р является строкой, которая выглядит как

<items> 
<item> 
<resourceid>blablabla</resourceid> 
<somerandomtag>whocares</somerandomtag> 
<orderedquantity>0.0</orderedquantity> 
</item> 
<item> 
<resourceid>oneofmyvalueIneed</resourceid> 
<somerandomtag>whocares</somerandomtag> 
<orderedquantity>1.0</orderedquantity> 
</item> 
<item> 
<resourceid>yetanother</resourceid> 
<somerandomtag>whocares</somerandomtag> 
<orderedquantity>0.0</orderedquantity> 
</item> 
</items> 
+0

Эта часть не имеет смысл: 'item.Element (" ResourceId "). Name! =" NULLOrderItem ")'. Имя всегда 'ResourceId', оно всегда возвращает' true'. Вы имели в виду 'Value'? –

+0

Вероятно, это относится к [обзору кода] (http://codereview.stackexchange.com/). В этом нет ничего плохого (кроме ошибки, которую я указал). Я бы, вероятно, проецировал XML на ваш объект * сначала *, а затем фильтр потом (так как фильтрация была бы немного проще). –

+0

Charles Mager ==> Совершенно верно о ценности. Глупая ошибка. Кроме того, извините, что он отправил его в неправильную часть, не знал, что даже был раздел обзора кода, по-прежнему новый пользователь. Но я не понимаю, что вы подразумеваете под «спроецировать свой xml сначала, а затем фильтровать», разве это не то, что я делаю? € dit = ok, см. Ниже ответ. Я получил его сейчас. – DoctorPrisme

ответ

1

Вы можете улучшить заявление if с использованием метода .Contains.

var validNames = new List<string> {"oneofmyvalueIneed","anotherone","yetanother"} 

XDocument myDoc = XDocument.Parse(p); 
var result = from item in myDoc.Descendants("Item") 
     where ((double)item.Element("orderedQuantity") > 0 &&     
      item.Element("ResourceId").Name != "NULLOrderItem") && // See Charles's comment about this line 
      validNames.Contains(iten.Element("Name").Value.ToLower()) 
     select item; 

foreach (var item in orderedRes) 
{ 
    FieldProperties elem = new FieldProperties(); 
    elem.Fieldname = xelem.Element("Name").Value; 
    elem.Fieldvalue = xelem.Element("OrderedQuantity").Value; 
    lElem.Add(elem); 
} 

Затем вы можете также заменить foreach с

select new FieldProperties 
{ 
    Fieldname = item.Element("Name").Value, 
    Fieldvalue = xelem.Element("OrderedQuantity").Value 
}; 

Добавление все это вместе + некоторые оптимизации при доступе к дочерним элементам он будет выглядеть так:

var validNames = new List<string> {"oneofmyvalueIneed","anotherone","yetanother"} 

XDocument myDoc = XDocument.Parse(p); 
var result = from item in myDoc.Descendants("Item") 
     let value = item.Element("orderedQuantity") 
     let name = iten.Element("Name").Value.ToLower() 
     where ((double)value > 0 &&     
      item.Element("ResourceId").Name != "NULLOrderItem") && // See Charles's comment about this line 
      validNames.Contains(name) 
     select new FieldProperties 
     { 
      Fieldname = name 
      Fieldvalue = value 
     }; 
+0

@CharlesMager - ops true :) глупая ошибка. Исправление –

+0

Спасибо! Для достоверности вашего ответа для следующего зрителя вы можете отредактировать предложение foreach: item ==> xelem (или заменить xelem по элементу в цикле) Отличный ответ, 10/10 спасибо :) – DoctorPrisme

+0

Я поддержал ваш ответ , но я могу пойти f * ck сам, так как мне не хватает репутации :( – DoctorPrisme

Смежные вопросы