C# 如何在构建字符串时保持上一行的缩进

C# 如何在构建字符串时保持上一行的缩进,c#,string,C#,String,考虑下面的例子。我用ToString方法定义了一个结构 调用ToString 所以ToString给出了一个漂亮且可读的字符串,其中a和B缩进四个空格。然而,假设我有一个新的结构 public struct OuterStruct { public double c; public InnerStruct inner; public override string ToString() { return $"OuterStruct:\n" +

考虑下面的例子。我用ToString方法定义了一个结构

调用ToString

所以ToString给出了一个漂亮且可读的字符串,其中a和B缩进四个空格。然而,假设我有一个新的结构

public struct OuterStruct
{
    public double c;
    public InnerStruct inner;

    public override string ToString()
    {
        return $"OuterStruct:\n" +
               $"    c: {c}\n" +
               $"    inner: {inner.ToString()}";
    }
}
正在写作

var u = new OuterStruct(){c=3, inner=i};
u.ToString()
@"OuterStruct:
     c: 3
     inner: InnerStruct:
     a: 1
     b: 2
"
但那不是我想要的。换行符\n强制下一行从开头开始,并从那里开始计算四个空格。我想要

@"OuterStruct:
     c: 3
     inner: InnerStruct:
         a: 1
         b: 2
"

即,我希望内部结构成员的缩进相对于内部结构的缩进开始。有什么想法吗?

您可以添加一个指示深度的重载:

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

public string ToString(int depth)
{
    var spaces = new string(' ', 4 * depth);
    return $"InnerStruct:\n" +
           $"{spaces}    a: {a}\n" +
           $"{spaces}    b: {b}";
}
然后在打印此内部结构时,传递深度:

$"    inner: {inner.ToString(1)}";

或者传递++深度,而不是1,任意选择。

您可以添加指示深度的重载:

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

public string ToString(int depth)
{
    var spaces = new string(' ', 4 * depth);
    return $"InnerStruct:\n" +
           $"{spaces}    a: {a}\n" +
           $"{spaces}    b: {b}";
}
然后在打印此内部结构时,传递深度:

$"    inner: {inner.ToString(1)}";

或者传递++深度而不是1,任意选择。

覆盖ToString怎么样

public struct InnerStruct
{
    public double a;
    public double b;

    public override string ToString()
    {
        return ToString(String.Empty);
    }

    public string ToString(string prefix )
    {
        return $"{prefix}InnerStruct:\n" +
               $"{prefix}    a: {a}\n" +
               $"{prefix}    b: {b}";
    }
}

对ToString的重写怎么样

public struct InnerStruct
{
    public double a;
    public double b;

    public override string ToString()
    {
        return ToString(String.Empty);
    }

    public string ToString(string prefix )
    {
        return $"{prefix}InnerStruct:\n" +
               $"{prefix}    a: {a}\n" +
               $"{prefix}    b: {b}";
    }
}

请注意,如果要将其用作$INERNAR:{INERNAR.ToString1};,然后您应该使用InnerStruct:\n而不是{spaces}InnerStruct:\n.Ha,这比我想得快:有趣的是:如果我有更深层的嵌套,这会起作用吗。我需要跟踪筑巢的深度吗?例如,根据深度传递8、12、16等。@morty然后将++深度传递给下一个ToString调用。请注意,如果要将其用作$inner:{inner.ToString};,然后您应该使用InnerStruct:\n而不是{spaces}InnerStruct:\n.Ha,这比我想得快:有趣的是:如果我有更深层的嵌套,这会起作用吗。我需要跟踪筑巢的深度吗?例如,根据深度传递8、12、16等。@morty然后将++深度传递给下一个ToString调用。