2010-01-04 3 views
1

J'ai écrit une méthode qui trie les valeurs d'un ComboBox, puis les enregistre dans un fichier Xml.ComboBox vers un fichier XML trié. Besoin d'aide pour optimiser

Je suis très mécontent de son apparence. N'hésitez pas à le démonter et aidez-moi à l'optimiser.

La méthode est très similaire à celui-ci:

public void Save(ComboBox comboBoxItems) 
{ 
    var xmlElements = new XElement("Root"); 
    List<string> children = new List<string> {comboBoxItems.Text}; 
    foreach (string child in comboBoxItems.Items) 
     if (!children.Contains(child)) 
      children.Add(child); 

    children.Sort(); 

    foreach (var child in children) 
     xmlElements.Add(new XElement("Child", child)); 

    xmlElements.Save("Output.xml"); 
} 
+0

Pouvez-vous être plus précis en ce qui concerne ce que vous faites pas cette approche? –

+0

J'ai deux boucles foreach. Je veux voir s'il y a un moyen d'en avoir un seul. – Vadim

Répondre

2

Que diriez-vous:

public static void Save(ComboBox items) { 
    XElement xmlElements = new XElement("Root"); 
    xmlElements.Add(
    items.Items 
     .Cast<string>() 
     .OrderBy(s => s) 
     .Select(s => new XElement("Child", s)) 
     .ToArray() 
); 
    xmlElements.Save("Output.xml"); 
} 
+0

Merci. Cela fonctionne très bien, sauf qu'il permet d'enregistrer des enregistrements en double. J'ai essayé d'utiliser Distinct() mais cela n'a pas aidé. – Vadim

+1

@Vadim: Vous devez mettre l'appel Distinct après le Cast, sinon il va les comparer en tant que références d'objets au lieu de chaînes. – Guffa

1

vôtre est pas si mal. Cette version est un peu plus aimable aux yeux

// you might need comboBoxItems.Items.OfType<string>() 
// doing this by memory lol  
var children = from x in comboBoxItems.Items 
       orderby x 
       select new XElement("Child", child); 
var xmlElements = new XElement("Root", children.ToArray()); 
xmlElements.Save("output.xml"); 

Cela ne deviendra jamais un goulot d'étranglement (exactement comment de nombreux articles avez-vous dans le combobox), donc je vous préoccupez pas de « performance » à moins qu'il spécifiquement surgit comme un goulot d'étranglement.

+0

Il semble que je ne puisse pas utiliser LINQ sur comboBoxItems.Items. Puis-je faire linq sur ComboBox.ObjectCollection? – Vadim