将对象列表写入文本文件

Write list of objects to text file

我有一道 class 菜是这样的:

public class Dish
{
    public Dish(int cost, string name)
    {
        Cost = cost;
        Name = name;
    }

    public int Cost { get; set; }
    public string Name { get; set; }
}

在主窗体中,用户可以输入以前的数据。 然后我创建一个列表 "Dish":

public static List<Piatto> List = new List<Piatto>();

我在静态 class 中创建了它,因此我可以从任何地方访问它。 一旦一个项目被添加到列表中,我想将它保存在一个文本文件 (.txt) 中,所以我尝试使用这个:

public static void SaveToTxt()
    {
        using (TextWriter tw = new StreamWriter(Path))
        {
            foreach (var item in Data.List)
            {
                tw.WriteLine(item.ToString());
            }
        }
    }

问题是,当我打开保存列表的文本文件时,我得到 "WindowsFormsApplication1.Dish"。

如何保存到显示成本和名称的文本文件?

P.s。我想将列表保存在文本文件中,因为删除一行对我来说更容易,这是我不知道如何用二进制文件做的事情。

提前致谢。

编辑:

重写 ToString() 方法效果很好。谢谢大家的回答!

覆盖 Dish 中的 ToString() 方法。例如:

public class Dish
{
   // rest of code..


   public override string ToString() 
   {
      return Cost.ToString() + " " + Name;
   }
}

你需要使用属性,所以像这样:

foreach (var item in Data.List)
{
    tw.WriteLine(item.Cost.ToString() + " " + item.Name);
}

将您的代码更改为类似这样的内容

public static void SaveToTxt()
{
    using (TextWriter tw = new StreamWriter(Path))
    {
        foreach (var item in Data.List)
        {
            tw.WriteLine(string.Format("{0} {1}", item.Name, item.Cost));
        }
    }
}

您需要重写 class 的 ToString 方法,如下所示:

public override string ToString()
{
    return string.Format("Name: {0}, Cost: {1}",Name,Cost);
}

您的 item 是一个包含多个属性的对象,您必须访问它们:

public static void SaveToTxt()
{
    using (TextWriter tw = new StreamWriter(Path))
    {
        foreach (var item in Data.List)
        {
            tw.WriteLine(string.Format("Item: {0} - Cost: {1}", item.Name, item.Cost.ToString()));
        }
    }
}

我认为你必须重写 Dish 中的 ToString 方法 class:

public class Dish
{
    public Dish(int cost, string name)
    {
        Cost = cost;
        Name = name;
    }

    public int Cost { get; set; }
    public string Name { get; set; }

    public override string ToString()
    {
        return $"{Name}: {Cost.ToString("c")}"; 
    }
}

很简单,你已经差不多了,我想你忘了覆盖 class 中的 .ToString() 方法。通过覆盖 .ToString() 方法,您可以 return 其对象的字符串表示形式。您也可以格式化它们。所以你必须添加这个重写的 .ToString() 方法来让它工作。考虑以下代码

public class Dish
{
    public Dish(int cost, string name)
    {
        Cost = cost;
        Name = name;
    }

    public int Cost { get; set; }
    public string Name { get; set; }
    public override string ToString() 
    {
       return String.Format("Item Name :{0} \n Item Cost : {1}", this.Name,this.Cost);
    }
}

考虑使用 XmlSerializer 将对象的内容写入 XML 文件。

https://support.microsoft.com/en-us/help/815813/how-to-serialize-an-object-to-xml-by-using-visual-c

如果您只想编写代码,没有太多代码更改的最快方法是覆盖您的 ToString 方法。

public class Dish
{
    public Dish(int cost, string name)
    {
       Cost = cost;
       Name = name;
    }

    public int Cost { get; set; }
    public string Name { get; set; }

    public override string ToString(){
        return "Name: "+Name+" cost: "+cost;
    }
}

当将 Dish 实例转换为 String 时,.Net 使用 ToString() 方法默认(即 Object.ToString())实现 returns 项的类型名称:

   WindowsFormsApplication1.Dish

您可以提供您的版本 ToString:

   public class Dish 
   {
     ...

       public override string ToString() 
       {
           return $"{Cost} {Name}";         
       }
   }

或者将正确的格式放在你写入文件的地方(在 Linq - Select 的帮助下):

   public static void SaveToTxt() {
     // File class allows to get rid of pesky readers and writers
     File.WriteAllLines(Path, Data.List.Select(dish => $"{dish.Cost} {dish.Name}"));
   }

试试这个:

步骤:

1.Get候选Class对象中的Item列表

2.PassSave方法中的Candidate列表

3.Write 文本文件中的内容**

    public class Candidate
    {
      public string Name{get;set;}
      public string Department{get;set;}
    }        
    public void save(List<Candidate>iolist)
    {          
     var dir = @"D:\New folder\log";
     string path = System.IO.Path.Combine(dir, "items1213.txt");
     File.WriteAllLines(path, iolist.Select(o => o.Name + " " + o.Department));    
    }