2016-10-07 3 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 

および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> 
+0

意味があります: 'item.Element(" ResourceId ")。Name!=" NULLOrderItem ")'。名前は常に 'ResourceId'です。常に' true'を返します。あなたは '価値'を意味しましたか? –

+0

これはおそらく[コードレビュー](http://codereview.stackexchange.com/)に属しています。私が指摘した間違いを除いて、これには本当に間違ったことは何もありません。私はおそらくあなたのオブジェクト*最初の*にXMLを投影し、その後(フィルタリングが少し楽になるので)後でフィルタリングします。 –

+0

チャールズ・マージャー==>全く価値がある。愚かな間違い。 また、間違った部分に投稿してごめんなさい、コードレビューセクション、まだ新しいユーザーがあったことを知らなかった。 しかし、私はあなたが "あなたのxmlを最初に投影してフィルタリングする"という意味を持っていません。 €dit = ok、以下の回答を見ました。 – DoctorPrisme

答えて

1

のように見える文字列であります.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); 
} 

その後、あなたはまた、それは次のようになり、子要素にアクセスするとき

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

foreachは+一緒にいくつかの最適化がそれをすべて追加する置き換えることができます。この部分にはない

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

私はあなたの答えをupvoted – DoctorPrisme