2013-08-30 59 views
0

我一直在使用Linq到XML一段時間,但遠離它的高級用戶。每隔一段時間我會看看自己的代碼,然後去「必須有一種更有效的方式來做到這一點」,所以我期待着看看StackOverflow的世界是否可能知道如何改進以下內容碼。目前所完成的方法是提供一個簡單的List<string>,其中包含一個軟件列表,該軟件列表將從保存在XML文件中的系統記錄中刪除。C#Linq to XML Element.Remove代碼優化

var xe = (from el in mainForm.xeSystemData.Elements("System") 
       where el.Element("Name").Value == systemName 
       select el.Element("SoftwareList")); 

    foreach (string sw in softwareToRemove) 
    { 
     foreach (var v in xe.Elements("Software")) 
     { 
      if (v.Value.ToString() == sw) 
      { 
       v.Remove(); 
      } 
     } 
    } 

這裏是XML的參考片段:

<SoftwareList> 
    <Software>IBM Client Access</Software> 
    <Software>Adobe Acrobat Reader 10.1</Software> 
</SoftwareList> 

我一直在想的是,有利用LINQ到XML去除選擇性元素,而創建兩個foreach循環更快的方法。

回答

2

我可能會做這樣的事情:

var toRemove = new HashSet<string>(sofwareToRemove); 

foreach(var item in xe.Elements("Software") 
         .Where(e => toRemove.Contains(e.Value)) 
{ 
    item.Remove(); 
} 

這是不特定的LINQ to XML雖然,只是用一個HashSet,而不是列表,從而減少從澳整體合力(N^2 )到O(n)的

+0

而且,更重要的是,在大多數情況下,我碰到了,使代碼更整潔。 – user2246674

+0

完美,更乾淨的代碼。 – Chris

1
var xe = (from el in mainForm.xeSystemData.Elements("System") 
      where el.Element("Name").Value == systemName 
      select el.Element("SoftwareList")); 

xe.Descendants("Software").Where(x => softwareToRemove.Contains(x.Value)).Remove(); 

你不需要運行任何foreach循環,只需添加上述LINQ查詢,你會得到期望的結果。我已經測試了我的查詢,它的功能正是你想要的

+0

'void刪除(這個IEnumerable 源代碼)'擴展方法在內部執行'foreach'循環,但是你是對的:代碼看起來更乾淨。 – MarcinJuraszek