Je veux que mon programme lise deux fichiers texte en un List<T>
. Le List<T>
trie et nettoie les doublons.
Je veux que le List<T>
soit sauvegardé (après le tri et le nettoyage) dans un fichier txt.
Mais quand j'ai regardé dans le fichier de résultat, j'ai trouvé le message suivant:
System.Collections.Generic.List`1 [System.String]
Quelqu'un at-il une idée de la façon dont je pourrais réparer cette erreur?
Voici mon code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Uniqpass
{
class Program
{
static void Main(string[] args)
{
String pfad = "C:\\Dokumente und Einstellungen\\Bektas\\Desktop\\test\\";
String pfad2 = "C:\\Dokumente und Einstellungen\\Bektas\\Desktop\\test\\";
String speichern = "C:\\Dokumente und Einstellungen\\Bektas\\Desktop\\test\\ausgabe.txt";
String datei = "text1.txt";
String datei2 = "text2.txt";
try
{
//Einlesen TxT 1
List<String> pass1 = new List<String>();
StreamReader sr1 = new StreamReader(pfad + datei);
while (sr1.Peek() > -1)
{
pass1.Add(sr1.ReadLine());
}
sr1.Close();
//Einlesen TxT 2
StreamReader sr2 = new StreamReader(pfad2 + datei2);
while (sr2.Peek() > -1)
{
pass1.Add(sr2.ReadLine());
}
sr2.Close();
List<String> ausgabeListe = pass1.Distinct().ToList();
ausgabeListe.Sort();
ausgabeListe.ForEach(Console.WriteLine);
StreamWriter file = new System.IO.StreamWriter(speichern);
file.WriteLine(ausgabeListe);
file.Close();
}
catch (Exception)
{
Console.WriteLine("Error");
}
Console.ReadKey();
}
}
}
Il existe une petite méthode pratique File.WriteAllLines - inutile d'ouvrir vous-même une StreamWriter
:
En .net 4:
File.WriteAllLines(speichern, ausgabeListe);
En .net 3.5:
File.WriteAllLines(speichern, ausgabeListe.ToArray());
De même, vous pouvez remplacer votre logique de lecture par File.ReadAllLines , qui renvoie un tableau de chaînes (utilisez ToList()
si vous voulez un List<string>
).
Donc, en fait, votre code complet pourrait être réduit à:
// Input
List<String> data = File.ReadAllLines(pfad + datei)
.Concat(File.ReadAllLines(pfad2 + datei2))
.Distinct().ToList();
// Processing
data.Sort();
// Output
data.ForEach(Console.WriteLine);
File.WriteAllLines(speichern, data);
C'est cette ligne qui écrit la représentation ToString de la liste, ce qui donne la ligne de texte que vous avez obtenue:
StreamWriter file = new System.IO.StreamWriter(speichern);
file.WriteLine(ausgabeListe);
file.Close();
Au lieu de cela, vous voulez écrire chaque ligne.
StreamWriter file = new System.IO.StreamWriter(speichern);
ausgabeListe.ForEach(file.WriteLine);
file.Close();
Parcourez la liste en écrivant chaque ligne individuellement:
StreamWriter file = new System.IO.StreamWriter(speichern);
foreach(string line in ausgabeListe)
file.WriteLine(line);
file.Close();
J'utilise le LINQ comme ci-dessous pour écrire chaque ligne dans un fichier texte.
var myList=new List<string>
{
"Hello",
"World"
};
using (var file = new StreamWriter("myfile.txt"))
{
myList.ForEach(v=>file.WriteLine(v));
}
Vous écrivez l'objet liste dans le fichier, vous voyez donc le nom du type.
Tout comme vous utilisez ForEach
pour écrire le contenu sur la console, vous devez effectuer une itération sur ausgabeListe
en appelant WriteLine()
pour chaque élément de la liste.
StreamWriter file = new System.IO.StreamWriter(speichern);
foreach(string x in ausgabeListe)
file.WriteLine(x);
file.Close();