2009-09-30 18 views

Antwort

116

Ich schlage vor, eine Kombination aus StringReader und meine LineReader-Klasse, die Teil von MiscUtil, sondern auch in this StackOverflow answer - Sie können einfach nur diese Klasse in Ihr eigenes Dienstprogramm Projekt kopieren. Sie würden es wie folgt verwenden:

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

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

Looping über alle Linien in einem Körper von String-Daten (ob, dass eine Datei ist oder was auch immer) ist so verbreitet, dass es nicht die Berufung Code erfordern sollte für sein Testen null etc :) Having said that, wenn Sie eine manuelle Schleife tun, tun wollen, ist dies die Form ist, die ich in der Regel über Fredrik bevorzugen:

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

auf diese Weise kann nur einmal für nichtig zu testen, und Sie müssen auch nicht an eine do/while-Schleife denken (was aus irgendeinem Grund immer mehr Mühe beim Lesen erfordert als eine gerade while-Schleife).

53

können Sie eine StringReader verwenden, um eine Zeile zu einem Zeitpunkt zu lesen:

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

von MSDN für 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); 
1

Hier ist ein kurzer Code-Schnipsel, die die erste nicht-leere Zeile in einer Zeichenfolge finden:

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

Ich weiß, das beantwortet wurde, aber ich möchte meine eigene Antwort hinzufügen:

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