2012-10-02 3 views
1

Je dois extraire des données d'un fichier texte, les trier, puis enregistrer les anciennes données avec les données nouvellement triées. Voici le format du fichier texte:Ignorer les espaces blancs lors de l'utilisation de List.Sort()

Dog 

Cow 

Sheep 

Si je lis le texte dans une liste, puis appeler la méthode de tri, je reçois ceci:

"" 
"" 
"" 
Cow 
Dog 
Sheep 

Ce n'est pas ce que je veux. Existe-t-il un moyen pour .Sort() d'ignorer les espaces blancs, ou dois-je aborder ce problème différemment?

EDIT J'ai besoin que les lignes vides soient présentes lors de la sauvegarde dans le fichier. La sortie doit être

Cow 

Dog 

Sheep 
+0

Avez-vous besoin de conserver ces entrées vides lorsque vous lisez la liste ou pouvez-vous les ignorer? –

+0

Pourquoi ne les ignorez-vous pas lorsque vous construisez la liste? – Tudor

+0

@BrianCrosby Voir édition. – broke

Répondre

5

Utilisez Linq. Devrait fonctionner:.

string[] myText = File.RealAllLines("yourfile.txt"); 
var sortedWithoutEmptyLines = myText 
    .Where(t=> !string.IsNullOrEmpty(t)) 
    .OrderBy(s=>s) 
    .Select(i => string.Concat(i, Environment.NewLine)); //Adding extra linebreak as asked 
File.WriteAllLines("yourfile.txt", sortedWithoutEmptyLines.ToArray()); 
+0

Vous devez ajouter les sauts de ligne lorsque vous réécrivez les données – Servy

+0

File.WriteAllLines ajoutera des sauts de ligne pour chaque élément. Je vois la question originale a été édité avec "nécessité de garder des lignes vides lors de la sauvegarde". – loopedcode

+0

WriteAllLines ajoute un saut de ligne après chaque élément. L'OP a besoin de deux sauts de ligne après chaque élément, vous devez donc ajouter un saut de ligne supplémentaire après chaque élément, éventuellement via un simple 'Select'. – Servy

2

Je vous suggère de construire à la place une autre List avec seulement les chaînes non-espace et de trier cela. Non seulement vous économiserez du temps (si vous avez des espaces vides entre chaque paire de «vraies» chaînes, vous trierez essentiellement les données sans raison), mais il sera beaucoup plus simple d'écrire.

2
string[] lines = File.ReadAllLines("yourInputFile.txt"); 
var outputData = lines 
     .Where(line => !string.IsNullOrEmpty(line)) //remove empty lines 
     .OrderBy(item => item) 
     .Select(line => line + Environment.NewLine); //add them back in 
File.WriteAllLines("yourOutputFile.txt", outputData.ToArray()); 

Il suffit de prendre toutes les lignes se vident, faire le tri, puis les remettre dans

Questions connexes