2012-01-16 5 views
24

Voglio che il mio programma legga da due file di testo in uno List<T>. List<T> ordina e pulisce i duplicati.Salvataggio dall'elenco <T> in txt

Voglio il List<T> per salvare (dopo l'ordinamento e la pulizia) in un file txt.

Ma quando ho guardato nel file txt risultato, ho trovato questo messaggio:

System.Collections.Generic.List`1 [System.String]

Qualcuno ha un'idea come posso risolvere questo errore?

Ecco il mio codice:

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(); 
     } 
    } 
} 

risposta

10

E 'questa linea che scrive la rappresentazione ToString della lista, risultante nella riga di testo che hai:

StreamWriter file = new System.IO.StreamWriter(speichern); 
file.WriteLine(ausgabeListe); 
file.Close(); 

Invece si vuole scrivere ogni riga .

StreamWriter file = new System.IO.StreamWriter(speichern); 
ausgabeListe.ForEach(file.WriteLine); 
file.Close(); 
66

C'è un po 'di metodo pratico File.WriteAllLines - non c'è bisogno di aprire un StreamWriter te stesso:

In .net 4:

File.WriteAllLines(speichern, ausgabeListe); 

In .net 3.5:

File.WriteAllLines(speichern, ausgabeListe.ToArray()); 

Allo stesso modo, è possibile sostituire la logica di lettura con File.ReadAllLines , che restituisce una serie di stringhe (utilizzare ToList() su quello se si desidera un List<string>).

Così, infatti, il codice completo potrebbe essere ridotto a:

// 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); 
+1

Risposta fantastica. Esattamente quello di cui avevo bisogno. –

+2

Questa risposta è ottima in quanto riduce potenzialmente diverse linee di codice su una singola riga. – Free2Rhyme2k

+0

@ Free2Rhyme2k: Sì, e meno righe di codice solitamente indicano meno errori. – Heinzi

1

Loop attraverso la lista, scrivendo ogni riga singolarmente:

StreamWriter file = new System.IO.StreamWriter(speichern); 
foreach(string line in ausgabeListe) 
    file.WriteLine(line); 
file.Close(); 
0

Si sta scrivendo l'oggetto elenco nel file , quindi vedi il nome del tipo.

Proprio come si utilizza ForEach per scrivere i contenuti nella console, è necessario scorrere su ausgabeListe, chiamando WriteLine() per ciascun elemento nell'elenco.

0
StreamWriter file = new System.IO.StreamWriter(speichern); 
foreach(string x in ausgabeListe) 
    file.WriteLine(x); 
file.Close(); 
+0

Puoi nominare le variabili, come "speichern" e "ausgabeListe" con qualcosa di più facile da capire? – Soyokaze

0

Sto usando il LINQ come di seguito per scrivere ogni riga in un file di testo.

var myList=new List<string> 
{ 
    "Hello", 
    "World" 
}; 
using (var file = new StreamWriter("myfile.txt")) 
{ 
    myList.ForEach(v=>file.WriteLine(v)); 
}