1

我有一个类(例如Foo)覆盖 ToString 方法来打印它的内部状态。这个类有一个集合Foo——它是子元素。孩子也可以生孩子等等。

我正在寻找在 ToString() 中实现的解决方案,它会自动缩进子元素,例如:

Parent Foo
 Child1 Foo
  Child1.1 Foo
 Child2 Foo
  Child2.1 Foo
  Child2.2 Foo
4

3 回答 3

6

解决方案是ToString()仅用作在子树的根上调用以输出的“入口点”。该ToString()方法可以调用ToIndentedString(int)将当前缩进级别作为参数的私有方法。然后,该方法将返回指定缩进处当前节点的字符串表示,以及缩进 + 1 处所有子节点的字符串表示等。

public string ToString()
{
    return ToIndentedString(0);
}

private string ToIndentedString(int indentation)
{
    StringBuilder result = new StringBuilder();
    result.Append(' ', indentation);
    result.Append(Environment.NewLine);
    foreach (Foo child in children) {
        result.Append(child.ToIndentedString(indentation + 1));
    }
    return result.ToString();
}
于 2013-01-08T14:10:57.220 回答
1

你也可以这样IFormattable使用Foo

public class Foo : IFormattable
{
    public string Text { get; set; }
    public IList<Foo> InnerList { get; set; } 

    public string ToString(string format, IFormatProvider formatProvider)
    {
        if (String.IsNullOrEmpty(format)) format = "0";
        if (formatProvider == null) formatProvider = CultureInfo.CurrentCulture;

        int indent = 0;
        Int32.TryParse(format, out indent);
        string indentString = "";
        while(indent > indentString.Length)
        {
            indentString += " ";
        }
        var toString = String.Format("{0}{1}", indentString, Text);
        foreach (Foo foo in InnerList ?? new List<Foo>())
        {
            toString += String.Format("\n{0}", foo.ToString((indent + 1).ToString(), formatProvider));
        }
        return toString;
    }

    public override string ToString()
    {
        return ToString("0", CultureInfo.CurrentCulture);
    }
}

在这种情况下,您还可以执行以下操作:

String.Format("{0:5}", foo); // Start with 5 indents

或者

foo.ToString("7", CultureInfo.CurrentCulture); // Also start with indents (7 in this case)
于 2013-01-08T14:52:36.763 回答
0
string spacing = "  ";
string newLineSpacing = string.Format("{0}{1}", Environment.NewLine, spacing);
StringBuilder sb = new StringBuilder("mydata");
foreach (Foo child in children)
{
    sb.Append(Environment.NewLine);
    sb.Append(spacing);
    sb.Append(child.ToString().Replace(Environment.NewLine, newLineSpacing));
}

未经测试,因为我目前正在重建我的开发机器。

于 2013-01-08T14:07:03.597 回答