【问题标题】:Write list of objects to text file将对象列表写入文本文件
【发布时间】:2017-11-06 00:13:39
【问题描述】:

我有一个像这样的类菜:

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

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

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

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

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

附:我想将列表保存在文本文件中,因为我更容易删除一行,而我不知道如何在二进制文件中执行此操作。

提前致谢。

编辑:

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

【问题讨论】:

标签: c# list streamwriter


【解决方案1】:

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

public class Dish
{
   // rest of code..


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

【讨论】:

  • 忘记了,反正编码愉快..!
【解决方案2】:

你需要使用属性,比如:

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

【讨论】:

    【解决方案3】:

    把你的代码改成这样的

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

    【讨论】:

    • @pitersmx 看起来有人对所有答案投了反对票。它们不是一些很棒的代码,但它们可以工作并解决 OP 的问题。
    • 我会加油的:)
    【解决方案4】:

    您需要像这样覆盖您的类的ToString 方法:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我认为您必须在 Dish 类中覆盖 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}: {Cost.ToString("c")}"; 
            }
        }
        

        【讨论】:

          【解决方案7】:

          很简单,你快到了,我想你忘了覆盖你类中的.ToString() 方法。通过覆盖.ToString() 方法,您可以返回其对象的字符串表示形式。您也可以格式化它们。所以你必须添加这个被覆盖的.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);
              }
          }
          

          【讨论】:

          • @the Down-voter:请说明原因,以便我改进帖子。如果是个人问题,则无需说明原因,将其视为挑战。
          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            如果你只是想写,没有太多代码更改的最快方法是覆盖你的 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;
                }
            }
            

            【讨论】:

              【解决方案10】:

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

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

              【讨论】:

                【解决方案11】:

                试试这个:

                步骤:

                1.获取Candidate Class对象中Item的列表

                2.通过Save方法中的Candidate列表

                3.将内容写入文本文件**

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

                【讨论】:

                  猜你喜欢
                  • 2013-04-27
                  • 2015-05-17
                  • 2020-07-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-09-10
                  • 2015-05-20
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多