2009-05-04 48 views
1

我重構從此我的foreach循環之前:LINQ重構

foreach (KeyValuePair[string, string] param in paramsList) 
{ 
    XmlElement mainNode = xmlDoc.CreateElement("parameter"); 
    mainNode.SetAttribute("name", param.Key); 
    mainNode.SetAttribute("value", param.Value); 
    rootNode.AppendChild(mainNode); 
} 

於此,在使用LINQ:

XmlElement mainNode = xmlDoc.CreateElement("parameter"); 
var selected = paramsList.AsEnumerable().Select(param => param).ToList(); 
selected.ForEach(x => (mainNode.SetAttribute("name", x.Key))); 
selected.ForEach(x => (mainNode.SetAttribute("value", x.Value))); 
rootNode.AppendChild(mainNode); 

但是,我知道下面的部分仍然可以重構爲一個循環,但我不知道如何。請賜教。

selected.ForEach(x => (mainNode.SetAttribute("name", x.Key))); 
selected.ForEach(x => (mainNode.SetAttribute("value", x.Value))); 
+0

是不是: 選擇(param => param) 冗餘? – 2009-05-04 12:33:49

+0

此外,您的原始代碼會產生與paramsList中的元素一樣多的「參數」元素,而重構後的代碼將始終生成一個「參數」元素,其中「name」和「value」屬性被設置爲length(paramsList)時間就可以了。我不認爲你有正確的重構。 – 2009-05-04 12:39:14

回答

3

我想你可以達到相同的結果:

 paramsList.ToList().ForEach(e => { 
      XmlElement mainNode = xmlDoc.CreateElement("parameter"); 
      mainNode.SetAttribute("name", e.Key); 
      mainNode.SetAttribute("value", e.Value); 
      rootNode.AppendChild(mainNode); 
     }); 

,但是,在這種情況下,我會選擇一個簡單的foreach

 foreach (var e in paramsList) 
     { 
      XmlElement mainNode = xmlDoc.CreateElement("parameter"); 
      mainNode.SetAttribute("name", e.Key); 
      mainNode.SetAttribute("value", e.Value); 
      rootNode.AppendChild(mainNode); 
     } 
2

也許這樣的事情

selected.ForEach(x => 
      { 
      mainNode.SetAttribute("name", x.Key); 
      mainNode.SetAttribute("value", x.Value); 
      }); 
0

你有可能從XmlDocument切換到XDocument嗎?正如您所期望的那樣,LINQ to XML與LINQ的整合更好。

var nodes = from pair in paramsList 
      select new XElement("parameter", 
           new XAttribute("name", pair.Key), 
           new XAttribute("value", pair.Value)); 

就是這樣,除了添加節點的文件,或者將它們傳遞到一個XDocument構造或什麼的。

編輯:爲了澄清,您的問題被標記爲「linqtoxml」,但LINQ to XML意味着System.Xml.Linq命名空間中的一組特定類,如XDocument,XElement和XAttribute。你的示例代碼沒有使用任何實際的LINQ to XML類,並且我建議如果你想用LINQ來構建你的XML,那麼實際的LINQ to XML類將比XmlDocument和朋友更好地爲你服務。