【问题标题】:How can I override the ToString() method to output a list?如何覆盖 ToString() 方法以输出列表?
【发布时间】:2011-09-13 22:15:56
【问题描述】:

是否可以重写 ToString() 方法来输出列表? 这是我的代码

    namespace CircularClass
{
    class InfinitelyCircular
    {

        public class RatsInAShip
        {
            public string RatBreed;
            public string RatWeight;
            public string RatAge;
            public bool HasChildren;
            public List<RatsInAShip> RatChildren;
            public override string ToString()
            {
                return String.Format("RatBreed:{0}\n RatWeight:{1}\n RatAge:{2}\n HasChildren:{3}",RatBreed, RatWeight, RatAge, HasChildren);
            }
        }

        static void Main(string[] args)
        {
            var mu = new RatsInAShip()
                         {
                             RatAge = "100",
                             RatBreed = "RexRat",
                             RatWeight = "200",
                             HasChildren = true,
                             RatChildren = new List<RatsInAShip>()
                         };

            for (var i = 0; i < 3; i++)
            {
                var cu = new RatsInAShip()
                             {
                                 RatAge = "100",
                                 RatBreed = "DwarfRat"+i,
                                 RatWeight = "200",
                                 HasChildren = false
                             };
                mu.RatChildren.Add(cu);
            }

            //Output
                Console.WriteLine(String.Format("{0}, {1}", mu.RatBreed, mu.RatChildren[0]));

        }
    }
}

如何重写 ToString() 以输出列表中的所有子项?

【问题讨论】:

  • “列表”是什么意思?你说的是List 类吗?还是您只是指String 中的逗号分隔列表?
  • 你不能,ToString() 和任何被覆盖的方法只能返回与父类相同的类型(在本例中为 string)。你的意思是你想输出一个字符串,每个孩子单独一行?
  • 这个link 可能会有所帮助

标签: c# .net list class overriding


【解决方案1】:

也许您可以在 foreach 循环中输出子项,如下所示:

public override string ToString()
{
    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("RatBreed:{0}\n RatWeight:{1}\n RatAge:{2}\n HasChildren:{3}\n",RatBreed, RatWeight, RatAge, HasChildren);
    foreach (RatsInAShip rat in RatChildren)
    {
        sb.AppendFormat("\tRat Child: {0}\n", rat);
    }
    return sb.ToString();
}

我还没有编译,所以如果我犯了错误,请纠正我。 [编辑] 现在编译... :)

【讨论】:

  • 注意:Abhi,当我运行它时,我收到一个异常,告诉您您的 RatChildren 变量未设置为对象的实例。您将不得不修改类的其余部分以确保该列表已实例化。但这将需要对您的程序进行与“ToString”无关的其他更改。
  • 因此,如果您将 Main 函数中的最后一行更改为: Console.WriteLine(mu);我还向 RatsInAShip 类定义添加了一个初始化程序,如下所示: public List RatChildren = new List();完成后,您将看到正确的结果,即: RatBreed:RexRat RatWeight:200 RatAge:100 HasChildren:True Rat Child: RatBreed:DwarfRat0 RatWeight:200 RatAge:100 HasChildren:False Rat Child: RatBreed:DwarfRat1 RatWeight: 200 RatAge:100 HasChildren:False Rat Child: RatBreed:DwarfRat2 RatWeight:200 RatAge:100 HasChildren:False
【解决方案2】:

您可以像之前那样覆盖ToString。您可以遍历列表的元素以输出您想要的字符串。

【讨论】:

    【解决方案3】:

    输出一个列表?如,返回一个列表?没有。两个原因:

    1. 您不能更改被覆盖方法的返回类型。
    2. ToString() 暗示它返回一个字符串。返回任何其他内容都非常不直观,并且会导致代码出现支持问题。

    【讨论】:

      【解决方案4】:

      是的:

      public override string ToString()
      {
          string result = "";
          if(RatChildren != null)
            foreach(var x in RatChildren)
              result += String.Format("RatBreed:{0}\n RatWeight:{1}\n RatAge:{2}\n HasChildren:{3}", x.RatBreed, x.RatWeight, x.RatAge, x.HasChildren);
      
          return result;
      }
      

      【讨论】:

      • 看到编辑,您还应该让它在附加到字符串时进行换行或其他分隔符。还可以考虑使用StringBuilder
      • Grrr,我提供了获得 +2 的人的建议的代码,我得到了 -1?请撤消...
      • 当您的代码不正确时,我做了 -1。我现在撤消了我的 -1。
      • (同意,某种分隔符等 - 但我们不要为他做所有的工作,哈哈)
      【解决方案5】:

      看起来你已经在你的类上重写了 ToString() 方法......所以......使用 StringBuilder 和 for/foreach 循环来构造你的输出字符串?

      【讨论】:

        【解决方案6】:

        不能更改被覆盖方法的返回类型。

        您需要编写自己的返回列表的方法:

        public IList<string> ToList()
        {
          // your code that returns a list of strings
        }
        

        【讨论】:

          猜你喜欢
          • 2019-08-20
          • 2018-01-10
          • 2018-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-13
          相关资源
          最近更新 更多