Сохранение из List‹T› в txt

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

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

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

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

person Jon Cylo    schedule 16.01.2012    source источник


Ответы (7)


Есть удобный маленький метод 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);
person Heinzi    schedule 16.01.2012
comment
Фантастический ответ. Именно то, что мне было нужно. - person B.K.; 25.09.2013
comment
Этот ответ великолепен, поскольку потенциально сокращает несколько строк кода до одной строки. - person Free2Rhyme2k; 12.08.2014
comment
@Free2Rhyme2k: Да, и чем меньше строк кода, тем меньше ошибок. - person Heinzi; 11.10.2016

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

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();
person Matten    schedule 16.01.2012

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

StreamWriter file = new System.IO.StreamWriter(speichern);
foreach(string line in ausgabeListe)
    file.WriteLine(line);
file.Close();
person itsme86    schedule 16.01.2012

Попробуйте код ниже:

StreamWriter writer = new StreamWriter("C:\\Users\\Alchemy\\Desktop\\c#\\InputFileFrmUser.csv");
list = new List<Product>() { new Product() { ProductId=1, Name="Nike 12N0",Brand="Nike",Price=12000,Quantity=50},
        new Product() { ProductId =2, Name = "Puma 560K", Brand = "Puma", Price = 120000, Quantity = 55 },
        new Product() { ProductId=3, Name="WoodLand V2",Brand="WoodLand",Price=21020,Quantity=25},
        new Product() { ProductId=4, Name="Adidas S52",Brand="Adidas",Price=20000,Quantity=35},
        new Product() { ProductId=5, Name="Rebook SPEED2O",Brand="Rebook",Price=1200,Quantity=15}};

foreach (var x in list) {
    string wr = x.ProductId + " " + x.Name + "" + x.Brand + " " + x.Quantity + " " + x.Price;
    writer.Flush();
    writer.WriteLine(wr);

}
Console.WriteLine("--------ProductList Updated SucessFully----------------");
person Prabhakaran M    schedule 24.07.2019

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

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

person Jay    schedule 16.01.2012

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

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

person    schedule
comment
Не могли бы вы назвать переменные, такие как speichern и ausgabeListe, более понятными? - person Weifeng; 19.10.2016