LINQ Refactorización
-
03-07-2019 - |
Pregunta
Replanté mi bucle foreach antes de esto:
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);
}
para esto, usando 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);
Sin embargo, sé que la sección a continuación todavía puede ser refaccionada en un solo bucle pero no sé cómo. por favor ilumíname.
selected.ForEach(x => (mainNode.SetAttribute("name", x.Key)));
selected.ForEach(x => (mainNode.SetAttribute("value", x.Value)));
Solución
Creo que puedes lograr los mismos resultados con:
paramsList.ToList().ForEach( e => {
XmlElement mainNode = xmlDoc.CreateElement("parameter");
mainNode.SetAttribute("name", e.Key);
mainNode.SetAttribute("value", e.Value);
rootNode.AppendChild(mainNode);
});
pero, en este caso, elegiría un foreach
simple:
foreach (var e in paramsList)
{
XmlElement mainNode = xmlDoc.CreateElement("parameter");
mainNode.SetAttribute("name", e.Key);
mainNode.SetAttribute("value", e.Value);
rootNode.AppendChild(mainNode);
}
Otros consejos
tal vez algo como esto
selected.ForEach(x =>
{
mainNode.SetAttribute("name", x.Key);
mainNode.SetAttribute("value", x.Value);
});
¿Alguna posibilidad de que pueda cambiar de XmlDocument a XDocument? LINQ to XML se integra mucho mejor con LINQ, como es de esperar.
var nodes = from pair in paramsList
select new XElement("parameter",
new XAttribute("name", pair.Key),
new XAttribute("value", pair.Value));
Y eso es todo, excepto por agregar los nodos al documento o pasarlos a un constructor de XDocument o algo así.
Editar: para aclarar, tu pregunta está etiquetada como < linqtoxml " ;, pero LINQ to XML implica un conjunto específico de clases en el espacio de nombres System.Xml.Linq, como XDocument, XElement y XAttribute. Su código de muestra no utiliza ninguna clase real de LINQ to XML, y le sugiero que si desea usar LINQ para crear su XML, las clases reales de LINQ to XML le servirían mejor que XmlDocument y sus amigos.