117 votes

C #: Boucle entre les lignes d'une chaîne multiligne

Quel est un 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)?

180voto

Jon Skeet Points 692016

Je suggère d'utiliser une combinaison de StringReader et mon LineReader classe, qui fait partie de MiscUtil mais également à disposition dans cet StackOverflow répondez - vous pouvez facilement copier juste que la classe dans votre propre projet d'utilitaire. Vous souhaitez utiliser comme ceci:

string text = @"First line
second line
third line";

foreach (string line in new LineReader(() => new StringReader(text)))
{
    Console.WriteLine(line);
}

En boucle sur toutes les lignes du corps de la chaîne de données (si c'est un fichier ou quoi que ce soit) est tellement courante qu'elle ne doit pas nécessiter le code d'appel de tester la valeur null etc :) cela dit, si vous ne voulez faire un manuel de boucle, c'est la forme qui en général, je préfère plus de Fredrik:

using (StringReader reader = new StringReader(input))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        // Do something with the line
    }
}

De cette façon, vous n'avez qu'à tester la nullité d'une fois, et vous n'avez pas à penser à une boucle do-while (qui, pour une raison toujours me prend plus d'effort pour le lire qu'une simple boucle while).

86voto

Fredrik Mörk Points 85694

Vous pouvez utiliser StringReader pour lire une ligne à la fois:

 using (StringReader reader = new StringReader(input))
{
    string line = string.Empty;
    do
    {
        line = reader.ReadLine();
        if (line != null)
        {
            // do something with the line
        }

    } while (line != null);
}
 

9voto

tster Points 9948

à partir de MSDN pour StringReader

     string textReaderText = "TextReader is the abstract base " +
        "class of StreamReader and StringReader, which read " +
        "characters from streams and strings, 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 string 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.
    string aLine, aParagraph = null;
    StringReader strReader = new StringReader(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);
 

2voto

palswim Points 4353

Voici un extrait de code rapide qui trouvera la première ligne non vide d'une chaîne:

 string 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 string */ }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X