C #: Çok satırlı dizge satırları arasında döngü


100

Çok satırlı bir dizenin her satırında çok daha fazla bellek kullanmadan (örneğin onu bir diziye bölmeden) döngü yapmanın iyi bir yolu nedir?

Yanıtlar:


159

MiscUtil'in bir parçası olan ancak bu StackOverflow cevabında da mevcut olan StringReaderve LineReadersınıfımın bir kombinasyonunu kullanmanızı öneririm - sadece bu sınıfı kendi yardımcı program projenize kolayca kopyalayabilirsiniz. Bunu şu şekilde kullanırsın:

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

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

(Bu dosya var ya da ne olursa olsun) dize veri vücutta çizgiler o çağıran kod gerektirmez gerektiğini ortak böylece boş vb test edilecek her yerinde olduğu Döngü :) eğer, söyledikten do a yapmak istiyorum manuel döngü, bu genellikle Fredrik'inkine tercih ettiğim biçimdir:

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

Bu şekilde, yalnızca bir kez boşluğu test etmeniz gerekir ve bir do / while döngüsü de düşünmek zorunda değilsiniz (bu, bazı nedenlerden dolayı okumak için her zaman düz bir while döngüsünden daha fazla çaba gerektirir).


74

Bir seferde StringReaderbir satırı okumak için a kullanabilirsiniz :

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

1
Harika; +1; bu yardımcı oldu; ancak şunu eklemek istiyorum ki, bu durumda kapatılacak herhangi bir kaynak olmadığı için aslında "using" bloğunu kullanmaya gerek yoktur. Docs.microsoft.com adresindeki StringReader makalesindeki açıklamalara
RD

10

Bunun yanıtlandığını biliyorum, ancak kendi cevabımı eklemek istiyorum:

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

7

StringReader için MSDN'den

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

2

Bir dizedeki ilk boş olmayan satırı bulacak hızlı bir kod parçacığı:

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

2

Bu eski soruyu .NET 4 için güncellemek için artık çok daha düzgün bir yol var:

var lines = File.ReadAllLines(filename);

foreach (string line in lines)
{
    Console.WriteLine(line);
}

0

String.Split Yöntemini kullanmayı deneyin:

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

foreach (string line in text.Split('\n'))
{
    // do something
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.