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

mor*_*rty 1 c# string

请考虑以下示例.我用ToString()方法定义一个结构

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

    public override string ToString()
    {
        return $"InnerStruct:\n" +
               $"    a: {a}\n" +
               $"    b: {b}";
    }
}
Run Code Online (Sandbox Code Playgroud)

调用 ToString()

 var i = new InnerStruct(){a=1, b=2};
 i.ToString()
 @"InnerStruct:
     a: 1
     b: 2
 "
Run Code Online (Sandbox Code Playgroud)

因此,它ToString()提供了一个漂亮且可读的字符串,其中ab缩进了四个空格.但是,假设我有一个新结构

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

    public override string ToString()
    {
        return $"OuterStruct:\n" +
               $"    c: {c}\n" +
               $"    inner: {inner.ToString()}";
    }
}
Run Code Online (Sandbox Code Playgroud)

现在写作

var u = new OuterStruct(){c=3, inner=i};
u.ToString()
@"OuterStruct:
     c: 3
     inner: InnerStruct:
     a: 1
     b: 2
"
Run Code Online (Sandbox Code Playgroud)

但那不是我想要的.换行\n强制下一行从头开始,从那里算出四个空格.我想要

@"OuterStruct:
     c: 3
     inner: InnerStruct:
         a: 1
         b: 2
"
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*ter 5

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

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}";
}
Run Code Online (Sandbox Code Playgroud)

然后在打印这个内部结构时,传递深度:

$"    inner: {inner.ToString(1)}";
Run Code Online (Sandbox Code Playgroud)

或者通过++depth代替1,无论你想要什么.

  • 请注意,如果您打算将它用作`$"inner:{inner.ToString(1)}";`,那么您应该使用``InnerStruct:\n"`而不是``{spaces} InnerStruct:\n "`. (3认同)