Сохранение из списка <T>в txt - PullRequest
27 голосов
/ 16 января 2012

Я хочу, чтобы моя программа читала из двух текстовых файлов в один List<T>. List<T> сортирует и очищает дубликаты.

Я хочу List<T> сохранить (после сортировки и очистки) в текстовый файл.

Но когда я посмотрел в результате текстовый файл, я нашел это сообщение:

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

У кого-нибудь есть идеи, как можно исправить эту ошибку?

Вот мой код:

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

Ответы [ 6 ]

70 голосов
/ 16 января 2012

Есть небольшой удобный метод File.WriteAllLines - нет необходимости открывать StreamWriter самостоятельно:

В .net 4:

File.WriteAllLines(speichern, ausgabeListe);

В .net 3.5:

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

Аналогично, вы можете заменить свою логику чтения на File.ReadAllLines , которая возвращает массив строк (используйте ToList() для этого, если вы хотите List<string>).

Таким образом, фактически ваш полный код может быть уменьшен до:

// 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);
10 голосов
/ 16 января 2012

Именно эта строка записывает ToString представления List, в результате чего вы получаете текстовую строку:

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

Вместо этого вы хотите написать каждую строку.

StreamWriter file = new System.IO.StreamWriter(speichern);
ausgabeListe.ForEach(file.WriteLine);
file.Close();
1 голос
/ 16 января 2012

Прокручивание списка, запись каждой строки в отдельности:

StreamWriter file = new System.IO.StreamWriter(speichern);
foreach(string line in ausgabeListe)
    file.WriteLine(line);
file.Close();
0 голосов
/ 09 марта 2018

Я использую LINQ, как показано ниже, для записи каждой строки в текстовый файл.

var myList=new List<string>
{
    "Hello",
    "World"
};
using (var file = new StreamWriter("myfile.txt"))
{
    myList.ForEach(v=>file.WriteLine(v));
}
0 голосов
/ 16 января 2012
StreamWriter file = new System.IO.StreamWriter(speichern);
foreach(string x in ausgabeListe)
    file.WriteLine(x);
file.Close();
0 голосов
/ 16 января 2012

Вы записываете объект списка в файл, поэтому видите имя типа.

Так же, как вы используете ForEach для записи содержимого на консоль, вам нужно выполнить итерацию по ausgabeListe, вызывая WriteLine() для каждого элемента в списке.

...