对c#多行字符串的缩进起作用

时间:2016-07-22 09:37:24

标签: c# string multiline

我想从c#中编写一些Html(html是一个例子,这可能是其他语言..)

例如:

    string div = @"<div class=""className"">
                      <span>Mon text</span>
                   </div>";

将产生:

<div class="className">
            <span>Mon text</span>
         </div>
从Html的角度来看,这并不是很酷......

获得正确的HTML缩进的唯一方法是缩进C#代码,如下所示:

            string div = @"<div class=""className"">
    <span>Mon text</span>
</div>";

我们得到正确缩进的Html:

<div class="className">
    <span>Mon text</span>
</div>

但像这样缩进C#确实打破了代码的可读性......

有没有办法对C#语言中的缩进进行操作?

如果没有,有人提示的好于:

string div = "<div class=\"className\">" + Environment.NewLine +
             "  <span>Mon text</span>" + Environment.NewLine +
             "</div>";

并且优于

var sbDiv = new StringBuilder();
sbDiv.AppendLine("<div class=\"className\">");
sbDiv.AppendLine("    <span>Mon text</span>");
sbDiv.AppendLine("</div>");

我用作解决方案:

非常感谢@Yotam的回答。

我写了一个小扩展来进行对齐&#34;动态&#34; :

    /// <summary>
    /// Align a multiline string from the indentation of its first line
    /// </summary>
    /// <remarks>The </remarks>
    /// <param name="source">The string to align</param>
    /// <returns></returns>
    public static string AlignFromFirstLine(this string source)
    {
        if (String.IsNullOrEmpty(source)) {
            return source;
        }

        if (!source.StartsWith(Environment.NewLine)) {
            throw new FormatException("String must start with a NewLine character.");
        }

        int indentationSize = source.Skip(Environment.NewLine.Length)
                                .TakeWhile(Char.IsWhiteSpace)
                                .Count();

        string indentationStr = new string(' ', indentationSize);
        return source.TrimStart().Replace($"\n{indentationStr}", "\n");
    }

然后我可以这样使用它:

private string GetHtml(string className)
{
    return $@"
            <div class=""{className}"">
                <span>Texte</span>
            </div>".AlignFromFirstLine();
}

返回正确的html:

<div class="myClassName">
    <span>Texte</span>
</div>

一个限制是它只适用于空格缩进...

欢迎任何改进!

4 个答案:

答案 0 :(得分:3)

您可以将字符串包装到下一行以获得所需的缩进:

    string div = 
@"
<div class=""className"">
    <span>Mon text</span>
</div>"
.TrimStart(); // to remove the additional new-line at the beginning

另一个不错的解决方案(缺点:取决于缩进级别!)

        string div = @"
        <div class=""className"">
        <span>Mon text</span>
        </div>".TrimStart().Replace("\n            ", "\n");

它只是删除了字符串中的缩进。确保Replace的第一个字符串中的空格数与缩进的空格数相同。

答案 1 :(得分:2)

我更喜欢this solution,但是如何:

string div = "<div class='className'>\n"
           + "    <span>Mon text</span>\n"
           + "</div>";

这摆脱了一些混乱:

  • "替换字符串中的',这样您就不需要转义引号。 (Single quotes in HTML appear to be legal.
  • 您还可以使用常规""字符串文字而不是@""
  • 使用\n代替Environment.NewLine

请注意the string concatenation is performed during compilation, by the compiler。 (另请参阅之前从事C#编译工作的Eric Lippert关于此主题的thisthis博客文章。)没有运行时性能损失。

答案 2 :(得分:0)

如果它是一个长字符串,那么您始终可以将字符串保存在文本文件中并将其读入您的变量,例如

string text = File.ReadAllText(@"c:\file.txt", Encoding.UTF8);

通过这种方式,您可以使用文本编辑器将其格式化,并且不会对代码外观产生负面影响。

如果您正在动态更改字符串的部分内容,那么StringBuilder是您的最佳选择。 - 或者如果您决定从文本文件中读取字符串,则可以在字符串中包含{0}个元素,然后使用string.format(text, "text1","text2", etc)更改所需的部分。

答案 3 :(得分:0)

受 Kotlin 中的 DEFAULT_OPTION_VALUE 启发。

此代码:

trimIndent()

将产生一个字符串:

    var x = @"
       anything
         you
       want
    ".TrimIndent();

anything you want

实施:

"\nanything\n    you\nwant\n"