Серьезно запоздалое редактирование: если вы используете .NET 4.0 или более позднюю версию
Класс File
имеет новый метод ReadLines
, который лениво перечисляет строки, а не жадно читает их все в массив, подобный ReadAllLines
. Так что теперь вы можете иметь как эффективность и краткость с:
var lineCount = File.ReadLines(@"C:\file.txt").Count();
Оригинальный ответ
Если вы не слишком обеспокоены эффективностью, вы можете просто написать:
var lineCount = File.ReadAllLines(@"C:\file.txt").Length;
Для более эффективного метода вы можете сделать:
var lineCount = 0;
using (var reader = File.OpenText(@"C:\file.txt"))
{
while (reader.ReadLine() != null)
{
lineCount++;
}
}
Редактировать: В ответ на вопросы об эффективности
Причина, по которой я сказал, что второе было более эффективным, касалась использования памяти, а не обязательно скорости. Первый загружает все содержимое файла в массив, что означает, что он должен выделять как минимум столько же памяти, сколько размер файла. Вторая просто зацикливает одну строку за раз, поэтому ей никогда не нужно выделять больше памяти на одну строку за раз. Это не так важно для небольших файлов, но для больших файлов это может быть проблемой (например, если вы попытаетесь найти количество строк в файле 4 ГБ в 32-разрядной системе, например, там, где его просто недостаточно) адресное пространство пользовательского режима для выделения массива такого размера).
Что касается скорости, я бы не ожидал, что в ней будет много. Возможно, что ReadAllLines имеет некоторую внутреннюю оптимизацию, но, с другой стороны, возможно, ему придется выделить большой кусок памяти. Я предполагаю, что ReadAllLines может быть быстрее для небольших файлов, но значительно медленнее для больших файлов; хотя единственный способ определить это - измерить его с помощью секундомера или профилировщика кода.