[Edytuj]
Jeśli robisz to przycięcie początku pliku dziennika, można uniknąć załadowanie całego pliku robiąc coś takiego:
// 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);
}
Przede wszystkim, skoro File.ReadAllLines
ładuje cały plik do tablicy łańcuchowej (string[]
), kopiowanie do listy jest zbędne.
Po drugie, musisz zrozumieć, że List
jest zaimplementowany przy użyciu dynamicznej macierzy pod maską. Oznacza to, że CLR będzie musiał przydzielić i skopiować kilka tablic, dopóki nie będzie w stanie pomieścić całego pliku. Ponieważ plik jest już na dysku, możesz wziąć pod uwagę szybkość transakcji dla pamięci i pracę z danymi na dysku lub przetwarzać je w mniejszych porcjach.
Jeśli trzeba załadować go w całości w pamięci przynajmniej spróbować zostawić w tablicy:
string[] lines = File.ReadAllLines("file.txt");
Jeśli to naprawdę musi być List
, linie ładunkowe jeden po drugim:
List<string> lines = new List<string>();
using (var sr = new StreamReader("file.txt"))
{
while (sr.Peek() >= 0)
lines.Add(sr.ReadLine());
}
Uwaga:List<T>
konstruktor która przyjmuje parametr przepustowości. Jeśli znasz numer linii z wyprzedzeniem, można zapobiec wielu przydziałów przez preallocating tablicę z góry:
List<string> lines = new List<string>(NUMBER_OF_LINES);
Nawet lepiej unikać przechowywania całego pliku w pamięci i przetwarza je „w locie”:
using (var sr = new StreamReader("file.txt"))
{
string line;
while (line = sr.ReadLine() != null)
{
// process the file line by line
}
}
Czy nie będzie raczej trudno dodawać wpisy do 'LogList', gdy zaznaczysz je jako' readonly'? – Tim
Oznacza to, że nie można ponownie przypisać odwołania, a nie jest to lista tylko do odczytu. – Deleted
Proszę nie umieszczać w tytule "C#" tylko po to, by powiedzieć, o co chodzi w tym pytaniu - po to są te znaczniki. –