ReadAllLines pour un object Stream?

Il existe un File.ReadAllLines mais pas un Stream.ReadAllLines .

 using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt")) using (StreamReader reader = new StreamReader(stream)) { // Would prefer ssortingng[] result = reader.ReadAllLines(); ssortingng result = reader.ReadToEnd(); } 

Existe-t-il un moyen de le faire ou dois-je parcourir manuellement le fichier ligne par ligne?

Vous pouvez écrire une méthode qui lit ligne par ligne, comme ceci:

 public IEnumerable ReadLines(Func streamProvider, Encoding encoding) { using (var stream = streamProvider()) using (var reader = new StreamReader(stream, encoding)) { ssortingng line; while ((line = reader.ReadLine()) != null) { yield return line; } } } 

Puis appelez-le comme:

 var lines = ReadLines(() => Assembly.GetExecutingAssembly() .GetManifestResourceStream(resourceName), Encoding.UTF8) .ToList(); 

La partie Func<> doit faire face à plusieurs lectures et éviter de laisser des stream ouverts inutilement. Bien entendu, vous pouvez facilement insérer ce code dans une méthode.

Si vous n’avez pas besoin de tout en mémoire, vous n’avez même pas besoin de la liste de ToList

La propriété .EndOfStream peut être utilisée dans la boucle au lieu de vérifier si la ligne suivante n’est pas nulle.

 List lines = new List(); using (StreamReader reader = new StreamReader("example.txt")) { while(!reader.EndOfStream) { lines.Add(reader.ReadLine()); } } 
 using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt")) using (StreamReader reader = new StreamReader(stream)) { // Would prefer ssortingng[] result = reader.ReadAllLines(); ssortingng[] result = reader.ReadToEnd().Split(Environment.NewLine.ToCharArray(), SsortingngSplitOptions.RemoveEmptyEnsortinges); } 

L’utilisation de Split ici:

 reader .ReadToEnd() .Split(Environment.NewLine.ToCharArray(), SsortingngSplitOptions.RemoveEmptyEnsortinges); 

n’est pas équivalent à ReadLine . Si vous regardez la source pour ReadLine , ReadLine , vous verrez qu’elle gère correctement les terminateurs de ligne: \ r, \ n et \ r \ n. ReadLine ne ReadLine pas de chaîne vide supplémentaire lorsque le terminateur de ligne est \ r \ n, ce qui est typique sous DOS / Windows. Split “voit” (parsing) \ r suivi de \ n comme 2 délimiteurs séparés et renvoie une chaîne vide.

‘SsortingngSplitOptions.RemoveEmptyEnsortinges’ dans le code ci-dessus supprime ces chaînes vides, mais supprimera également toutes les lignes vides qui apparaissent dans l’entrée.

Ainsi, pour la ligne d’entrée 1 \ r \ r line3 \ ReadLine renvoie 3 lignes. Le 2ème est vide. Split crée 4 chaînes. (Il y a une chaîne supplémentaire après le dernier \ r.) Il supprime alors les 2ème et 4ème.

Notez que Split n’est pas bien adapté à l’parsing de lignes de texte délimitées “post-fix”. C’est-à-dire que le délimiteur apparaît après le jeton. Bien que Split soit approprié pour infixer, les délimiteurs apparaissent entre les jetons. C’est la différence entre a, b, c et ligne1 \ r, ligne2, ligne3 \ r. Pour ces entrées, Split renvoie respectivement 3 chaînes ou 4 chaînes.

Si vous voulez utiliser StreamReader, alors oui, vous devrez utiliser ReadLine et faire une boucle sur StreamReader, en lisant ligne par ligne.

Quelque chose comme ca:

 ssortingng line; using (StreamReader reader = new StreamReader(stream)) { while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } 

ou essayer

 using (StreamReader reader = new StreamReader("file.txt")) { ssortingng[] content = reader.ReadToEnd().Replace("\n","").Split('\t'); }