2009-05-04 5 views
1

Je refactorisé ma boucle foreach de cette avant:LINQ refactorisation

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

à cela, en utilisant 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); 

Cependant, je sais que la section ci-dessous peut encore être refactorisé en une seule boucle, mais Je ne sais pas comment. S'il te plaît, éclaire-moi.

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

N'est pas: Sélectionner (param => param) redondant? –

+0

De plus, votre code original produirait autant d'éléments "paramètres" que d'éléments dans paramsList, tandis que le code refacturé produirait toujours exactement un élément "parameter", avec les attributs "name" et "value" étant définis length (paramsList) fois dessus. Je ne pense pas que vous l'ayez refactorisé correctement. –

+0

ouais vous avez absolument raison. de toute façon, je viens de commenter le code de bruno conde et maintenant je ne remplace pas plutôt ma boucle foreach existante. – grayman

Répondre

3

Je pense que vous pouvez obtenir les mêmes résultats avec:

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

mais, dans ce cas, je choisirais simple 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

je vois .. alors vous pouvez déjà faire ça. En voyant votre code m'a fait choisir la boucle foreach simple maintenant. C'est parce que comparer à la simple boucle de foreach je ne chargerai plus mon code pour créer une Generic.List et ne déléguera plus non plus. Merci! – grayman

2

peut-être quelque chose comme ça

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

Y a-t-il une chance de passer de XmlDocument à XDocument? LINQ to XML s'intègre beaucoup mieux avec LINQ, comme vous pouvez vous y attendre.

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

Et c'est, sauf pour ajouter des nœuds au document, ou les passer dans un constructeur XDocument ou quelque chose. Editer: Pour clarifier, votre question est étiquetée "linqtoxml", mais LINQ to XML implique un ensemble spécifique de classes dans l'espace de noms System.Xml.Linq, comme XDocument, XElement et XAttribute. Votre exemple de code n'utilise aucune classe LINQ en XML, et je suggère que si vous voulez utiliser LINQ pour construire votre XML, les classes LINQ to XML actuelles vous serviront mieux que XmlDocument et vos amis.