c# - 从 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 ***
解决方案
懒惰地附加标题。(伪代码)
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;
即可使其工作。
推荐阅读
- javascript - audioContext.suspend() 没有按预期停止音乐
- java - 如何避免浮动操作按钮隐藏
- python - 试图以 '\x0a' 格式查找不类似于十六进制的字符
- node.js - 使用 firebase 身份验证数据并从 firebase 用户向 mongodb 添加额外信息
- dart - 如何创建由群组图标照片中的用户组成的群聊图标(群组中用户的拼贴)
- javascript - optionComponent 和 valueComponent 在最新版本的 react-select 中不起作用
- javascript - 如何在“MadLibs”风格的文字游戏的 javascript 片段中编写非文字字符?
- php - 如何在 Laravel 5.7 中使用 Vue.js 文件(不是 CDN)?
- reactjs - 函数在 .then 之前完成
- sql - 自动恢复备份