68 votes

Comment lire au mieux un fichier dans la liste<string>

J'utilise une liste pour limiter la taille du fichier car la cible est limitée en disque et en RAM. C'est ce que je fais maintenant, mais y a-t-il un moyen plus efficace?

 readonly List<string> LogList = new List<string>();
...
var logFile = File.ReadAllLines(LOG_PATH);
foreach (var s in logFile) LogList.Add(s);

130voto

Evan Mulawski Points 28536
var logFile = File.ReadAllLines(LOG_PATH);
var logList = new List<string>(logFile);

Puisque logFile est un tableau, vous pouvez le transmettre au constructeur List<T> . Cela élimine la surcharge inutile lors de l'itération sur le tableau ou de l'utilisation d'autres classes d'E/S.

Implémentation réelle du constructeur :

 public List(IEnumerable<T> collection)
{
        ...
        ICollection<T> c = collection as ICollection<T>;
        if( c != null) {
            int count = c.Count;
            if (count == 0)
            {
                _items = _emptyArray;
            }
            else {
                _items = new T[count];
                c.CopyTo(_items, 0);
                _size = count;
            }
        }   
        ...
} 

70voto

user193061 Points 71

Une petite mise à jour de la réponse d'Evan Mulawski pour la raccourcir

List<string> allLinesText = File.ReadAllLines(fileName).ToList()

14voto

Daniel Pryden Points 22167

Pourquoi ne pas utiliser un générateur à la place ?

 private IEnumerable<string> ReadLogLines(string logPath) {
    using(StreamReader reader = File.OpenText(logPath)) {
        string line = "";
        while((line = reader.ReadLine()) != null) {
            yield return line;
        }
    }
}

Ensuite, vous pouvez l'utiliser comme vous utiliseriez la liste :

 var logFile = ReadLogLines(LOG_PATH);
foreach(var s in logFile) {
    // Do whatever you need
}

Bien sûr, si vous avez besoin d'un List<string> , vous devrez alors conserver l'intégralité du contenu du fichier en mémoire. Il n'y a vraiment aucun moyen de contourner cela.

10voto

Ammar The Trainer Points 113

Vous pouvez simplement lire de cette façon.

 List<string> lines = System.IO.File.ReadLines(completePath).ToList();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X