首页 > 解决方案 > 从 StringBuilder 中删除双新行

问题描述

我在 stringbuilder 中使用了一些简单的代码,并且一切都正确复制,直到两个环境换行符开始播放。然后我写了一些替换代码来删除双空行,它不起作用。只是想看看是否有人在这里有更好的主意以及我缺少什么。Lister 是文本块标题,单词是输入文本框。

var listed =
    TxtBlocks.Zip(UserText.DefaultIfEmpty(), (n, w) => new { Lister = n, Word = w });

StringBuilder sb = new StringBuilder();

sb.AppendLine(("*** " + headerBl.Text + " ***").PadLeft(30) + Environment.NewLine);

foreach (var nw in listed)
{
    if (nw.Word.Length > 0)
    {
        if (nw.Lister.Contains("*** Apples ***") || nw.Lister.Contains("*** Oranges ***") ||
           nw.Lister.Contains("*** Mangos ***"))
            sb.Append(Environment.NewLine);
        sb.Append((nw.Lister + "" + nw.Word).Trim() + Environment.NewLine);
    }
}

if (sb.ToString().Contains(Environment.NewLine + Environment.NewLine))
{
    sb = sb.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine);
}

Clipboard.SetDataObject(sb.ToString()); ;

在“*** Apples *** 插入”之前有一些用户文本的入口点。如果输入其中一行,则打印正常:

*** header ***

lister0 and word0

*** apples ***
so on...

但是,如果在 *** apples *** 列表中没有插入任何内容,则换行符会堆积起来,所以我将替换添加到代码中,但它不起作用。

*** header ***


*** apples ***

标签: c#

解决方案


懒惰地附加标题。(伪代码)

string lastHeader = null;
foreach (var nw in listed) {
    if (there is an entry point to add) {
        string header = GetHeader();
        if (header != lastHeader) {
            AppendHeader(sb, header);
            lastHeader = header;
        }
        AppendEntryPoint(sb, nw);
    }
}

只有在至少有一个入口点的情况下才会打印标题。

如果您在事件处理程序而不是循环中附加标头,只需将lastHeader变量转换为类字段private string lastHeader;即可使其工作。


推荐阅读