Quel est le bon moyen de parcourir chaque ligne d’une chaîne multiligne sans utiliser beaucoup plus de mémoire (par exemple sans la diviser en un tableau)?
Je suggère d’utiliser une combinaison de SsortingngReader
et de ma classe SsortingngReader
, qui fait partie de MiscUtil mais qui est également disponible dans cette réponse StackOverflow . Vous pouvez facilement copier cette classe dans votre propre projet utilitaire. Vous l’utiliseriez comme ceci:
ssortingng text = @"First line second line third line"; foreach (ssortingng line in new LineReader(() => new SsortingngReader(text))) { Console.WriteLine(line); }
Faire une boucle sur toutes les lignes dans un corps de données de type chaîne (que ce soit un fichier ou autre) est si courant qu’il ne devrait pas être nécessaire de tester le code d’appel pour null, etc. 🙂 Cela dit, si vous voulez faire un boucle manuelle, c’est la forme que je préfère généralement à celle de Fredrik:
using (SsortingngReader reader = new SsortingngReader(input)) { ssortingng line; while ((line = reader.ReadLine()) != null) { // Do something with the line } }
De cette façon, vous n’avez à tester la nullité qu’une fois, et vous n’avez pas non plus à penser à une boucle do / while (ce qui, pour une raison quelconque, me demande plus de temps à lire qu’une simple boucle).
Vous pouvez utiliser un SsortingngReader
pour lire une ligne à la fois:
using (SsortingngReader reader = new SsortingngReader(input)) { ssortingng line = ssortingng.Empty; do { line = reader.ReadLine(); if (line != null) { // do something with the line } } while (line != null); }
à partir de MSDN pour SsortingngReader
ssortingng textReaderText = "TextReader is the abstract base " + "class of StreamReader and SsortingngReader, which read " + "characters from streams and ssortingngs, respectively.\n\n" + "Create an instance of TextReader to open a text file " + "for reading a specified range of characters, or to " + "create a reader based on an existing stream.\n\n" + "You can also use an instance of TextReader to read " + "text from a custom backing store using the same " + "APIs you would use for a ssortingng or a stream.\n\n"; Console.WriteLine("Original text:\n\n{0}", textReaderText); // From textReaderText, create a continuous paragraph // with two spaces between each sentence. ssortingng aLine, aParagraph = null; SsortingngReader strReader = new SsortingngReader(textReaderText); while(true) { aLine = strReader.ReadLine(); if(aLine != null) { aParagraph = aParagraph + aLine + " "; } else { aParagraph = aParagraph + "\n"; break; } } Console.WriteLine("Modified text:\n\n{0}", aParagraph);
Voici un extrait de code rapide qui trouvera la première ligne non vide dans une chaîne:
ssortingng line1; while ( ((line1 = sr.ReadLine()) != null) && ((line1 = line1.Trim()).Length == 0) ) { /* Do nothing - just trying to find first non-empty line*/ } if(line1 == null){ /* Error - no non-empty lines in ssortingng */ }
Je sais que cela a été répondu, mais je voudrais append ma propre réponse:
using (var reader = new SsortingngReader(multiLineSsortingng)) { for (ssortingng line = reader.ReadLine(); line != null; line = reader.ReadLine()) { // Do something with the line } }
Pour mettre à jour cette ancienne question pour .NET 4, il existe désormais une méthode beaucoup plus simple:
var lines = File.ReadAllLines(filename); foreach (ssortingng line in lines) { Console.WriteLine(line); }