为什么StringBuilder.AppendLine不添加带有一些字符串的新行?

kol*_*lin 31 .net c# stringbuilder newline

我正在尝试使用stringbuilder来创建一个字符串体,用于文本(而不是HTML)电子邮件.但是有些行(我包含动态数据,不添加新行,但在某些行中,换行符按预期工作).

在使用stringbuilder类时是否存在基本的缺失或是否存在应该发生的更基本的过程?

在下面的代码中:

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com");
sbUser.AppendLine();
sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy"));
sbUser.AppendLine("==============================================================");
sbUser.AppendLine();
Run Code Online (Sandbox Code Playgroud)

(ContentPage和thisEvent是使用Subsonic(v2)构建的自定义类.PageTitle是字符串的输出类型)

将此作为输出:

    Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com

Selected event : My Event Date of event : 16 Sept 2012 ==============================================================
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,代码中第3行之后的所有内容都会使所有内容都转到一行.

但是,我使用的代码更进一步:

sbRR.AppendLine("First name : " + txtFirstname.Text.Trim());
sbRR.AppendLine("Surname : " + txtSurname.Text.Trim());
etc,
Run Code Online (Sandbox Code Playgroud)

并且所有这些都正确地出现在单独的行上.我不明白为什么会这样.

电子邮件是这样组成的

mailMessage.Body = sbUser.ToString() + sbRR.ToString();


添加以下代码:

sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle + Environment.NewLine); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy") + Environment.NewLine);
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

Selected event : My Event

Date of event : 16 Sept 2012

==============================================================
Run Code Online (Sandbox Code Playgroud)

我认为这是有效的,除了它添加了2个换行符(AppendLine和Environment.NewLine).似乎直接从数据库直接将数据拉入一个字符串构建器似乎搞乱了行结束.即使我在数据库拉动后添加文本,它仍然保持在一行.

UPDATE

做的 StringBuilder.Append("blah"+Environment.NewLine) 产生了正确的结果,但是我仍然不理解为什么它有效并且.AppendLine("blah"+<database content>)不起作用.

cjm*_*rph 33

我知道这个问题已经过时了,并且已被标记为已回答,但我想我会在此处添加此内容,以防其他任何人遇到此问题,因为这是Google首次点击StringBuilder.AppendLine()无效.

我遇到了同样的问题,结果证明是一个Outlook问题.Outlook通过删除额外的换行符重新格式化基于文本的电子邮件.您可以在单个电子邮件的标题中单击"我们删除此邮件中的额外换行符 - >还原换行符",或者更改执行此令人讨厌的小技巧的设置"选项 - >邮件 - >邮件格式 - >删除额外行打破纯文本消息"

解决方法(因为您无法控制每个潜在电子邮件目标的设置)我在此处找到了新闻稿格式和删除额外的换行问题.基本上,如果在每行的开头添加两个空格字符,Outlook将不会重新格式化电子邮件.

这是一个帮助的扩展方法(方法名称有点冗长,所以根据自己的喜好改变:))

namespace System.Text
{
    public static class StringBuilderExtensions
    {
        public static void AppendLineWithTwoWhiteSpacePrefix(this StringBuilder sb, string value)
        {
            sb.AppendFormat("{0}{1}{2}", "  ", value, Environment.NewLine);
        }

        public static void AppendLineWithTwoWhiteSpacePrefix(this StringBuilder sb)
        {
            sb.AppendFormat("{0}{1}", "  ", Environment.NewLine);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


ole*_*sii 25

代替

sbUser.AppendLine();
Run Code Online (Sandbox Code Playgroud)

尝试使用

sbUser.Append(Environment.NewLine);
Run Code Online (Sandbox Code Playgroud)

不知道为什么会这样......

  • AppendLine只调用this.Append(Environment.NewLine); (11认同)
  • 你只需在StringBuilder上调用ToString(),然后获取你的新行;) (3认同)
  • 这给出了正确的结果,但为什么这会起作用而不是AppendLine? (2认同)
  • 反编译StringBuilder类后,它表明它在内部执行“ this.Append(Environment.NewLine);”。所以从技术上讲,两者都应得出相同的结果 (2认同)
  • 我知道,这是一个问题.在我的机器上,这给出了正确的结果,这令人费解. (2认同)

Lia*_*iam 6

使用 Environment.NewLine

sbUser.AppendLine("Please find below confirmation of your registration details. If any of these details are incorrect, please email someone@somewhere.com");
sbUser.AppendLine(Environment.NewLine);
sbUser.AppendLine("Selected event : " + ContentPage.FetchByID(int.Parse(ddlEvent.SelectedValue)).PageTitle); 
sbUser.AppendLine("Date of event : " + thisEvent.EventStartDate.ToString("dd MMM yyyy"));
sbUser.AppendLine("==============================================================");
sbUser.AppendLine(Environment.NewLine);
Run Code Online (Sandbox Code Playgroud)

  • AppendLine只调用this.Append(Environment.NewLine); (3认同)
  • [*默认行终止符是Environment.NewLine属性的当前值*](http://msdn.microsoft.com/en-us/library/ebk18257%28v=vs.90%29.aspx) (2认同)