Я имею строку в C# и хотел бы получить текст от определенной строки, сказать 65. И если бы файл не имеет такого количества строк, я хотел бы добраться "". Как сделать это?
Быстро и просто, предполагая, что \r\n или \n - это ваша последовательность новых строк
string GetLine(string text, int lineNo)
{
string[] lines = text.Replace("\r","").Split('\n');
return lines.Length >= lineNo ? lines[lineNo-1] : null;
}
Я не думаю, что есть более быстрый способ, кроме использования определенной файловой структуры и файловых операций более низкого уровня, чем чтение 64 строк, отбросить их а затем прочтите 65-ю строчку и сохраните ее. На каждом этапе вы можете легко проверить, прочитали ли вы весь файл.
Если у вас уже есть экземпляр строки, вы можете использовать String.Split
, чтобы разделить каждую строку и проверить, доступна ли строка 65, и если да, то используйте ее.
Если содержимое находится в файле, используйте File.ReadAllLines
, чтобы получить массив строк, а затем выполните ту же проверку, о которой говорилось ранее. Это будет хорошо работать для небольших файлов, если ваш файл большой, подумайте о чтении по одной строке за раз.
using (var reader = new StreamReader(File.OpenRead("example.txt")))
{
reader.ReadLine();
}
Вы можете использовать System.IO.StringReader
над вашей строкой. Затем вы могли бы использовать ReadLine()
, пока не дойдете до нужной строки или пока не закончится строка.
Поскольку все строки могут иметь разную длину, не существует быстрого перехода непосредственно к строке 65.
Когда вы Split()
строку, вы дублируете ее, что также удваивает потребление памяти.
private static string ReadLine(string text, int lineNumber)
{
var reader = new StringReader(text);
string line;
int currentLineNumber = 0;
do
{
currentLineNumber += 1;
line = reader.ReadLine();
}
while (line != null && currentLineNumber < lineNumber);
return (currentLineNumber == lineNumber) ? line :
string.Empty;
}
Что вы можете сделать, так это разделить строку на основе символа новой строки.
string[] strLines = yourString.split(Environment.NewLine);
if(strLines.Length > lineNumber)
{
return strLines[lineNumber];
}