2012-01-16 9 views
24

Quiero que mi programa lea de dos archivos de texto en uno List<T>. El List<T> está ordenando y limpiando duplicados.Guardando de la lista <T> a txt

Quiero List<T> para guardar (después de ordenar y limpiar) en un archivo txt.

Pero cuando miré en el archivo txt resultado, me encontré con este mensaje:

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

¿Alguien tiene una idea cómo podría solucionar este error?

Aquí está mi código:

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

Respuesta

10

Es esta línea que escribe la representación ToString de la lista, lo que resulta en la línea de texto que tienes:

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

lugar que desea escribir cada línea .

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

Hay un método poco práctico File.WriteAllLines - no hay necesidad de abrir un StreamWriter mismo:

En .NET 4:

File.WriteAllLines(speichern, ausgabeListe); 

En .NET 3.5:

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

Del mismo modo, puede reemplazar su lógica de lectura con File.ReadAllLines , que devuelve una matriz de cadenas (use ToList() en eso si quiere un List<string>).

Así que, de hecho, el código completo podría reducirse 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

Fantástica respuesta. Exactamente lo que necesitaba. –

+2

Esta respuesta es excelente ya que reduce potencialmente varias líneas de código a una sola línea. – Free2Rhyme2k

+0

@ Free2Rhyme2k: Sí, y menos líneas de código generalmente significan menos errores. – Heinzi

1

bucle a través de la lista, escribir cada línea individual:

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

Estás escribiendo el objeto de lista en el archivo , entonces ves el nombre del tipo.

Del mismo modo que utiliza ForEach para escribir el contenido en la consola, debe recorrer el ausgabeListe, llamando al WriteLine() para cada elemento de la lista.

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

¿Podría nombrar las variables, como "speichern" y "ausgabeListe" con algo más fácil de entender? – Soyokaze

0

Estoy utilizando el LINQ como a continuación para escribir cada línea en el archivo de texto.

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