2011-06-13 58 views
2

是否可以重写ToString()方法来输出列表? 这里是我的代码如何覆盖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()输出所有的孩子在一个列表?

+0

你所说的“名单”是什么意思?你在谈论List类吗?或者你只是指'String'中的逗号分隔列表? – 2011-06-13 13:20:54

+0

你不能,'ToString()'和任何重写的方法只能返回与父类相同的类型(在本例中为'string')。你的意思是你想要在一条单独的线上为每个孩子输出一个字符串吗? – 2011-06-13 13:21:02

+0

此[链接](http://msdn.microsoft.com/en-us/library/ms173154(VS.80)的.aspx)可以帮助 – robasta 2011-06-13 13:24:14

回答

3

也许你可以输出的孩子在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(); 
} 

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

+0

注:ABHI,当我运行它,我得到一个异常,告诉你RatChildren变量没有被设置为一个对象的实例。你将不得不修改你的类的其余部分,以确保列表被实例化。但是这需要对程序进行其他与“ToString”无关的更改。 – 2011-06-13 13:31:26

+0

因此,如果您将主要功能中的最后一行设置为: 控制台。的WriteLine(亩); 此外,我添加了一个初始化程序到RatsInAShip类定义,如下所示: public List RatChildren = new List (); 一旦做到这一点,你会看到正确的结果是这样的: RatBreed:RexRat RatWeight:200 RatAge:100 HasChildren:真 鼠儿童:RatBreed:DwarfRat0 RatWeight:200 RatAge:100个 HasChildren:假 鼠儿童:RatBreed:DwarfRat1 RatWeight:200 RatAge:100个 HasChildren:假 鼠儿童:RatBreed:DwarfRat2 RatWeight:200 RatAge:100个 HasChildren:假 – 2011-06-13 13:33:23

1

不能变化的覆盖方法的返回类型。

你需要编写自己的方法,该方法返回一个列表:

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

看起来你已经覆盖toString()方法类...所以...使用StringBuilder和一个for/foreach循环来构造你的输出字符串?

1

是:

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; 
} 
+1

锯的编辑,你也应该得到它做一个换行符,或附加到字符串时的其他分隔符。另外考虑使用'StringBuilder'。 – 2011-06-13 13:23:14

+0

Grrr,我提供了获得+2的家伙的建议的代码,并且我得到了-1?撤消请... – Nathan 2011-06-13 13:23:20

+0

我做了-1,当你有不正确的代码。我现在撤消了我的-1。 – 2011-06-13 13:25:57

1

输出列表?如在,返回一个列表? No.两个原因:

  1. 您无法更改重写方法的返回类型。
  2. ToString()意味着它返回一个字符串。返回其他任何东西都会非常不直观,并会引起代码的支持问题。
0

您可以覆盖ToString,因为您已经完成了。你可以遍历列表中的元素来输出你想要的字符串。