[Chỉnh sửa]
Nếu bạn đang làm điều này để cắt đầu của một tập tin nhật ký, bạn có thể tránh tải toàn bộ tập tin bằng cách làm một cái gì đó như thế này:
// count the number of lines in the file
int count = 0;
using (var sr = new StreamReader("file.txt"))
{
while (sr.ReadLine() != null)
count++;
}
// skip first (LOG_MAX - count) lines
count = LOG_MAX - count;
using (var sr = new StreamReader("file.txt"))
using (var sw = new StreamWriter("output.txt"))
{
// skip several lines
while (count > 0 && sr.ReadLine() != null)
count--;
// continue copying
string line = "";
while (line = sr.ReadLine() != null)
sw.WriteLine(line);
}
Đầu tiên, kể từ File.ReadAllLines
tải toàn bộ tệp vào một mảng chuỗi (string[]
), sao chép vào danh sách là không cần thiết.
Thứ hai, bạn phải hiểu rằng List
được triển khai bằng cách sử dụng mảng động dưới mui xe. Điều này có nghĩa rằng CLR sẽ cần phải phân bổ và sao chép một số mảng cho đến khi nó có thể chứa toàn bộ tập tin. Kể từ khi tập tin đã có trên đĩa, bạn có thể xem xét tốc độ giao dịch cho bộ nhớ và làm việc trên đĩa dữ liệu trực tiếp, hoặc xử lý nó trong khối nhỏ hơn.
Nếu bạn cần phải tải nó hoàn toàn trong bộ nhớ, ít nhất là cố gắng để lại trong một mảng:
string[] lines = File.ReadAllLines("file.txt");
Nếu nó thực sự cần là một List
, đường dây tải từng người một:
List<string> lines = new List<string>();
using (var sr = new StreamReader("file.txt"))
{
while (sr.Peek() >= 0)
lines.Add(sr.ReadLine());
}
Lưu ý:List<T>
có hàm tạo chấp nhận tham số dung lượng. Nếu bạn biết số dòng trước, bạn có thể ngăn chặn nhiều phân bổ bởi preallocating mảng trước:
List<string> lines = new List<string>(NUMBER_OF_LINES);
Thậm chí tốt hơn, tránh lưu trữ toàn bộ tập tin trong bộ nhớ và xử lý nó "on the fly":
using (var sr = new StreamReader("file.txt"))
{
string line;
while (line = sr.ReadLine() != null)
{
// process the file line by line
}
}
Sẽ không khó để thêm các mục vào 'LogList' khi bạn đã đánh dấu nó là 'readonly'? – Tim
Điều đó có nghĩa là bạn không thể chỉ định lại tham chiếu thay vì đó là danh sách chỉ đọc. – Deleted
Xin vui lòng không đặt "C#" trong tiêu đề của bạn chỉ để nói những gì câu hỏi là về - đó là những gì các thẻ được cho. –