代码之家  ›  专栏  ›  技术社区  ›  mortysporty

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

  •  1
  • mortysporty  · 技术社区  · 7 年前

    考虑下面的例子。我用一个 ToString() 方法

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

    打电话

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

    以便 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
    "
    

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

    2 回复  |  直到 7 年前
        1
  •  5
  •   CodeCaster    7 年前

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

    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)}";
    

    或通过 ++depth 1 ,随便你。

        2
  •  1
  •   tmaj    7 年前

    重写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}";
        }
    }