将对象列表写入文本文件

时间:2017-06-05 08:58:58

标签: c# list streamwriter

我有一个类似这样的菜:

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”。

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

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

提前致谢。

编辑:

覆盖ToString()方法运行正常。谢谢大家的答案!

10 个答案:

答案 0 :(得分:3)

很简单,你几乎就在那里,我想你忘了覆盖你班级里面的.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);
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

public class Dish
{
   // rest of code..


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

答案 3 :(得分:0)

您需要使用属性,例如:

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

答案 4 :(得分:0)

将您的代码更改为此类

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

答案 5 :(得分:0)

您需要覆盖类的ToString方法,如下所示:

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

答案 6 :(得分:0)

我认为你必须在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 :(得分:0)

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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