【问题标题】:StringBuilder and IndentationStringBuilder 和缩进
【发布时间】:2021-05-07 12:25:20
【问题描述】:

我正在尝试在 StringBuilder 中缩进字符串块,但我得到的只是第一行的缩进。我理解它为什么这样做,但不知道是否有任何简单的方法可以实现我想要的。

void Main()
{
    var subLines = new StringBuilder();
    subLines.AppendLine("Sub Line1");
    subLines.AppendLine("Sub Line2");
    subLines.AppendLine("Sub Line3");

    var mainLines = new StringBuilder();
    mainLines.AppendLine("Main Line 1");
    mainLines.AppendLine("Main Line 2");    
    mainLines.Append("\t").Append(subLines.ToString());
    mainLines.AppendLine("Main Line 3");
    mainLines.ToString().Dump();
}

实际输出

Main Line 1
Main Line 2
    Sub Line1
Sub Line2
Sub Line3
Main Line 3

预期输出

Main Line 1
Main Line 2
   Sub Line1
   Sub Line2
   Sub Line3
Main Line 3

我也尝试过使用IndentedTextWriter,但结果相同。

public static class StringBuilderExtensions
{ 
    public static StringBuilder AppendIndented(this StringBuilder sb, string text)
    {
        var textWriter = new StringWriter(sb);
        var indentWriter = new IndentedTextWriter(textWriter, "\t\t");
        indentWriter.WriteLine("");
        indentWriter.Indent = 1;
        indentWriter.WriteLine(text);

        return sb;
    }
}

关于如何实现块缩进有什么想法吗?

【问题讨论】:

  • 您正在添加\t,然后添加subLines。您没有说将subLines 拆分为单独的行,并在每个 行的开头添加\t。也许您想要foreach (var line in subLines.Split("\n")) { mainLines.Append("\t").AppendLine(line); } 之类的东西?
  • StringBuilder 没有(自动)格式化功能,您必须自己构建它。现在,您正在添加一个 TAB 字符,然后是一堆对该 TAB 一无所知的行
  • @canton7 谢谢你,这就是我一直在寻找的东西,我为此创建了一个小扩展方法。如果您想将其发布为答案,我会接受。
  • @HansKesting:是的,你是对的。我理解它为什么这样做,但想看看框架中是否有任何可用的内置解决方案来实现结果。谢谢你:)

标签: c# string-formatting indentation


【解决方案1】:

这可能会有所帮助

      static void Main()
    {
        var subLines = new StringBuilder();
        subLines.AppendLine("Sub Line1");
        subLines.AppendLine("Sub Line2");
        subLines.AppendLine("Sub Line3");

        var mainLines = new StringBuilder();
                   
        ApplyIndentation(mainLines,subLines);
      
        mainLines.ToString();
        Console.WriteLine(mainLines);
      

    }
    private static void ApplyIndentation(StringBuilder mainLines, StringBuilder subLines)
    {
        
        string[] delim = { Environment.NewLine, "\n" };
        string[] lines = subLines.ToString().Split(delim, StringSplitOptions.None);
        mainLines.AppendLine("Main Line 1");
        mainLines.AppendLine("Main Line 2");
        foreach (string line in lines)
        {
            mainLines.Append(Indent(3)).AppendLine(line);
            
        }
        mainLines.AppendLine("Main Line 3");

    }
    public static string Indent(int count)
    {
        return "".PadLeft(count);
    }

【讨论】:

  • 这获得了所需的输出,但在我的上下文中唯一的问题是sublines 应该不知道缩进。 MainLines需要缩进控制。
  • 刚刚编辑并添加了一个方法 - 可能对你有用
【解决方案2】:

从 canton7 的评论中得到启发,这是我为实现结果而创建的扩展方法。

  public static class StringBuilderExtensions
    {
        public static StringBuilder AppendIndented(this StringBuilder sb, string textBlock)
        {
            foreach (var line in textBlock.TrimEnd().Split('\n'))
                if (!string.IsNullOrWhiteSpace(line))
                    sb.AppendLine($"\t{line}");
            return sb;
        }
    }

用法

    var subLines = new StringBuilder();
    subLines.AppendLine("Sub Line1");
    subLines.AppendLine("Sub Line2");
    subLines.AppendLine("Sub Line3");

    var mainLines = new StringBuilder();
    mainLines.AppendLine("Main Line 1");
    mainLines.AppendLine("Main Line 2");
    mainLines.AppendIntended(sublines);
    mainLines.AppendLine("Main Line 3");
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2010-10-27
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多