Який хороший спосіб провести цикл через кожен рядок багаторядкового рядка, не використовуючи значно більше пам’яті (наприклад, не розділяючи його на масив)?
Який хороший спосіб провести цикл через кожен рядок багаторядкового рядка, не використовуючи значно більше пам’яті (наприклад, не розділяючи його на масив)?
Відповіді:
Я пропоную використовувати комбінацію StringReader
та мого LineReader
класу, який є частиною MiscUtil, але також доступний у цій відповіді StackOverflow - ви можете легко скопіювати саме цей клас у свій власний проект утиліти. Ви використовуєте це так:
string text = @"First line
second line
third line";
foreach (string line in new LineReader(() => new StringReader(text)))
{
Console.WriteLine(line);
}
Циклічна над усіма рядками в тілі рядки даних (це чи файл або будь- інший ) є настільки загальним , що він не повинен вимагати викликає коду для перевірки на нуль і т.д. :) Сказавши , що, якщо ви дійсно хочете зробити ручний цикл, це форма, яку я, як правило, більше віддаю перевагу Фредріку:
using (StringReader reader = new StringReader(input))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// Do something with the line
}
}
Таким чином, вам доведеться лише один раз перевірити нікчемність, і вам не потрібно думати про цикл do / while (що чомусь завжди вимагає більше зусиль для читання, ніж прямий цикл).
Ви можете використовувати a StringReader
для читання рядка за раз:
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);
}
від MSDN для 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);
Ось швидкий фрагмент коду, який знайде перший не порожній рядок у рядку:
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 */ }
Спробуйте скористатися методом String.Split:
string text = @"First line
second line
third line";
foreach (string line in text.Split('\n'))
{
// do something
}