使用string.Join() 和LINQ 的Aggregate() 方法填充StringBuilder 的示例,该StringBuilder 充当文本行的累加器。
StringBuilder 对象在处理字符串时是一种方便的存储,它可以限制使用后需要进行垃圾回收的字符串的数量。
LINQ 的Skip() 和Take() 方法也用于跳过集合中指定数量的元素并获取指定数量的元素。
请注意,Take() 不会溢出:如果要获取的元素数量多于可用元素的数量,它只会获取它可以找到的元素。
我混合了string.Join() 和Aggregate() 来展示它们的用途,您实际上可以使用其中一个来执行所有操作。
使用Aggregate(),StringBuilder 中的最后一个字符由Environment.NewLine 确定,需要删除。
请注意,StringBuilder.ToString() 方法允许生成内容的子字符串。
如果您改用String.Join(),则无需去除尾随字符。
你可以调用MergeLines()方法为:
RichTextBox1.Text = MergeLines(RichTextBox1.Text, 1, 4)
将 RichTextBox 中的 4 行文本合并,从第 1 行到第 4 行。
如果您有 6 行并且想要全部合并,请指定:
RichTextBox1.Text = MergeLines(RichTextBox1.Text, 0, 5)
该方法检查指定的起始行和结束行是否表示与文本内容兼容的行值。
Imports System.Linq
Imports System.Text
Private Function MergeLines(text As String, lineStart As Integer, lineEnd As Integer) As String
Dim lines = text.Split(ControlChars.Lf)
If lines.Length < 2 OrElse (lineStart < 0 OrElse lineEnd >= lines.Length) Then Return text
Dim sb = lines.Take(lineStart).
Aggregate(New StringBuilder(), Function(s, ln) s.AppendLine(ln))
sb.AppendLine(String.Join(" - ", lines.Skip(lineStart).Take(lineEnd - lineStart + 1)))
lines.Skip(lineEnd + 1).Aggregate(sb, Function(s, ln) s.AppendLine(ln))
Return sb.ToString(0, sb.Length - Environment.NewLine.Length)
End Function
将字符串元素聚合到 StringBuilder 的第一行代码说明:
Dim sb = lines.
Take(lineStart).
Aggregate(New StringBuilder(),
Function(s, ln) s.AppendLine(ln)
- 使用
lines 集合:
- 取
lineStart 行数。 lineStart 是要合并的第一行:如果 lineStart = 2 - 第三行 - 然后取 2 行,因此行 0 和 1)。
- 在一个新的 StringBuilder 对象中聚合每一行。 StringBuilder 附加每一行加上
Environment.NewLine。
- 聚合的结果是一个填充的 StringBuilder 对象。
C#版本:
private string MergeLines(string text, int start, int end)
{
var lines = text.Split('\n'); ;
if (lines.Length < 2 || (start < 0 || end >= lines.Length)) return text;
var sb = lines.Take(start).Aggregate(new StringBuilder(), (s, ln) => s.AppendLine(ln));
sb.AppendLine(string.Join(" - ", lines.Skip(start).Take(end - start + 1)));
lines.Skip(end + 1).Aggregate(sb, (s, ln) => s.AppendLine(ln));
return sb.ToString(0, sb.Length - Environment.NewLine.Length);
}