2014-12-07 5 views
15

, так что я не могу этого сделать, MyFile.txt имеет либо «английский», «французский», либо «немецкий» в первой строке , и я хочу получить язык от в первой строке текстового файла, а затем продолжить мой кодЧитайте только первую строку из текстового файла

String[] languages = new String[] { "english", "french", "german"}; 

foreach (String language in languages) 
{ 
    string line1 = File.ReadLines("MyFile.txt").Skip(0).Take(1); 
    line1 = language; 
    continue; 
} 
+0

проверить это сообщение: http://stackoverflow.com/questions/9439733/read-only-the-first-few-lines-of-text-from-a-file – abdo

ответ

29

Вы должны использовать File.ReadLines вместе с Enumerable.First. Это гарантирует вам только чтение первой строки из файла.

using System.Linq; 

...

string line1 = File.ReadLines("MyFile.txt").First(); // gets the first line from file. 

Отличие File.ReadAllLines в том, что File.ReadLines использует ленивые вычисления и оленья кожа прочитать файл Воле в массив строк первой.

+0

'System.IO.File' не делает содержат определение для «ReadLines» – user3542613

+0

Я заменил ReadLines на ReadAllLines, ошибка в комментарии выше исчезла, но теперь код ниже «continue;» недоступен – user3542613

+0

Почему этот ответ больше не поддерживается? – fjardon

34

Прокомментировать использование ReadAllLines() в комментарии ОП по вопросу ответа CSharpie; это может оказать огромное влияние на производительность, если MyFile.txt - очень большой файл.

File.ReadAllLines().First() будет на самом деле читать все линии, хранить их в string[], а затем взять первый. Поэтому, если ваш файл очень большой, он сохранит все эти строки в массиве, что может занять некоторое время.

Альтернативой и лучшим вариантом является просто открытие StreamReader и чтение только первой строки. Правильная реализация будет;

String[] languages = new String[] { "english", "french", "german"}; 
string firstLine; 

using(StreamReader reader = new StreamReader("MyFile.txt")) 
{ 
    firstLine = reader.ReadLine() ?? ""; 
} 

if(languages.Contains(firstLine)) 
{ 
    //... 
} 

Использование using будет заботиться о закрытии и утилизации читателя. Также, используя ??, убедитесь, что null никогда не возвращается (и таким образом сохраняет вас ArgumentNullException на Contains()).

+0

Я не использовал File.ReadAllLines, но File.ReadLines. – CSharpie

+0

@CSharpie, мой плохой, прочитайте комментарий OP и предположил, что он использовал 'ReadAllLines()'. Я отредактировал это в своем ответе! –

2

Хотя пост с 2014 года, более эффективным решением, использующее более позднего методом может быть таким:

System.IO.StreamReader readingFile = new System.IO.StreamReader(filePath); 

string readingLine = readingFile.ReadLine(); 

Таким образом, можно предотвратить чтение нескольких строк и необходимости получить первый с Linq.

+0

Этот метод существовал в 2014 году? [Здесь] (https://msdn.microsoft.com/fr-fr/library/system.io.streamreader (v = vs.110) .aspx), датой создания документации 2016. –

+0

Я не заметил дату первоначального вопроса, пока после того, как я отправил ответ, однако, я не принял его, потому что он все равно может принести пользу кому-то другому, отредактировал ответ, чтобы сделать это разъяснение. – KeOt777

+0

Это так же, как ответ Диона V. – CSharpie

Смежные вопросы