2009-05-04 15 views
1

Refactoring ich meine foreach-Schleife von diesem vor:LINQ Refactoring

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

dazu mit 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); 

aber ich weiß, dass unter dem Abschnitt noch in eine einzige Schleife Refactoring werden kann, aber Ich weiß nicht wie. bitte erleuchte mich.

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

nicht: Auswählen (param => param) redundant? –

+0

Außerdem würde Ihr ursprünglicher Code so viele "Parameter" -Elemente ergeben, wie Elemente in der paramsList vorhanden sind, während refaktorierter Code immer genau ein "parameter" -Element erzeugt, wobei "name" - und "value" -Attribute als Länge definiert sind (paramsList) mal drauf. Ich glaube nicht, dass Sie es korrekt refaktoriert haben. –

+0

ja du hast absolut recht. Wie auch immer, ich habe gerade den Code von Bruno Conde kommentiert und ID ersetzt meine existierende foreach-Schleife nicht mehr. – grayman

Antwort

3

Ich glaube, Sie die gleichen Ergebnisse mit erreichen können:

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

aber in diesem Fall würde ich wählen, ein einfaches foreach:

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

ich sehe .. so könnte man das schon machen. Als ich den Code sah, wählte ich jetzt die einfache foreach-Schleife. Es ist, weil ich mit der einfachen foreach-Schleife vergleichen werde, werde ich meinen Code nicht mehr belasten, um eine Generic.List zu erstellen und werde auch nicht mehr delegieren. Danke! – grayman

2

vielleicht so etwas wie diese

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

Können Sie von XmlDocument zu XDocument wechseln? LINQ to XML lässt sich viel besser mit LINQ integrieren, als Sie vielleicht erwarten.

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

Und das ist es, mit Ausnahme der Knoten zu dem Dokument hinzufügen oder sie in ein XDocument Konstruktor oder etwas vorbei.

Bearbeiten: Um zu verdeutlichen, ist Ihre Frage mit "linqtoxml" markiert, aber LINQ to XML impliziert eine bestimmte Gruppe von Klassen im Namespace System.Xml.Linq, wie XDocument, XElement und XAttribute. Ihr Beispielcode verwendet keine tatsächlichen LINQ to XML-Klassen, und ich schlage vor, dass, wenn Sie LINQ zum Erstellen Ihres XML verwenden möchten, die tatsächlichen LINQ to XML-Klassen Ihnen besser dienen als XmlDocument und Freunde.