Jaki jest dobry sposób na zapętlenie każdego wiersza wielowierszowego ciągu bez używania większej ilości pamięci (na przykład bez dzielenia go na tablicę)?
źródło
Jaki jest dobry sposób na zapętlenie każdego wiersza wielowierszowego ciągu bez używania większej ilości pamięci (na przykład bez dzielenia go na tablicę)?
Sugeruję użycie kombinacji StringReader
i moja LineReader
klasa, która jest częścią MiscUtil, ale jest również dostępna w tej odpowiedzi StackOverflow - możesz łatwo skopiować tylko tę klasę do własnego projektu narzędziowego. Używałbyś tego w ten sposób:
string text = @"First line
second line
third line";
foreach (string line in new LineReader(() => new StringReader(text)))
{
Console.WriteLine(line);
}
Zapętlenie nad wszystkie linie w ciele danych String (czy to jest plik lub cokolwiek) jest tak powszechne, że nie powinno wymagać kod wzywający do testowania dla wartości null itp :) Mimo, że jeśli nie chce zrobić pętla ręczna, jest to forma, którą zazwyczaj wolę od Fredrika:
using (StringReader reader = new StringReader(input))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// Do something with the line
}
}
W ten sposób wystarczy raz przetestować pod kątem nieważności i nie trzeba też myśleć o pętli do / while (która z jakiegoś powodu zawsze wymaga więcej wysiłku niż przeczytanie prostej pętli while).
Możesz użyć a, StringReader
aby odczytać wiersz na raz:
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);
}
Wiem, że otrzymałem odpowiedź, ale chciałbym dodać własną odpowiedź:
źródło
z MSDN dla StringReader
źródło
Oto krótki fragment kodu, który znajdzie pierwszą niepustą linię w ciągu:
źródło
Aby zaktualizować to starożytne pytanie dotyczące .NET 4, jest teraz znacznie bardziej przejrzysty sposób:
źródło
Spróbuj użyć metody String.Split:
źródło