繁体   English   中英

LinqToXml 的优化

[英]Optimisation of 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 

和 p 是一个字符串,看起来像

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

您可以使用.Contains方法改进if语句。

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
      };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM