如何在 C# 中正确重复字符:从朴素代码到优化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么重复字符的问题成了经典

\n\n

如果你曾经用 C# 写过代码,那么你肯定遇到过这样的任务:“我需要创建一个由 N 个相同字符组成的字符串”。看起来很简单,对吧?但正是这个问题在 Stack Overflow 上获得了 数千次浏览 和几十个回答。为什么?因为在看似简单的背后,隐藏着整个 性能优化 的世界和许多陷阱。

\n\n

在这篇文章中,我们不仅仅展示如何在 C# 中重复字符。我们将从朴素的解决方案出发,一路走到在高负载系统中使用的专业技巧。你将了解哪种方法 最适合在不同场景下重复字符,以及为什么一些流行的建议实际上是有害的。

\n\n

这篇文章对谁有用?

\n
    \n
  • 希望编写不仅可用而且高效的 C# 初学者开发者
  • \n
  • 寻找 优化字符串操作 方法的有经验的程序员
  • \n
  • 所有准备技术面试并希望展示对 .NET 内部机制深入了解的人
  • \n
\n\n

问题:为什么不应该使用 for 循环

\n\n

当新手听到“重复字符 N 次”时,首先想到的是 for 循环:

\n\n
string RepeatChar(char c, int count)\n{\n    string result = "";\n    for (int i = 0; i < count; i++)\n        result += c;\n    return result;\n}\n
\n\n

这个解决方案 能工作,但它 慢得可怕。为什么?因为 C# 中的字符串是 不可变的。每次 += 操作都会创建一个 新字符串,将旧内容加上一个字符复制进去。最终,这种算法的复杂度是 O(n²)。对于 10 个字符来说不明显,但对于 100,000 个字符来说,就是永恒。

\n\n

让我们看看实际数据。用 count = 100,000 测试这个方法。在现代处理器上,这将花费……几秒钟。如果需要重复字符一百万次呢?程序就会“卡死”。

\n\n

结论: 带拼接的循环是邪恶的。但还有其他更高效的方法。

\n\n

C# 中重复字符的主要方法

\n\n

让我们看看在 Stack Overflow 和实际项目中讨论的所有流行方法。我们将测试每种方法的性能,并分析何时使用哪种方法。

\n\n

1. 经典的 StringBuilder

\n\n

优化的第一步是使用 StringBuilder。它不会在每次添加时创建新字符串,而是使用缓冲区:

\n\n
string RepeatWithStringBuilder(char c, int count)\n{\n    StringBuilder sb = new StringBuilder(count);\n    for (int i = 0; i < count; i++)\n        sb.Append(c);\n    return sb.ToString();\n}\n
\n\n

注意:我们立即设置了 初始容量 count。这很重要!如果不指定容量,StringBuilder 将不得不多次重新分配内存,从而降低性能。

\n\n

性能: O(n)。对于 100,000 个字符,这个方法大约需要 ~1-2 毫秒。

\n\n

2. 字符数组 + new string

\n\n

这是 .NET 中 最快的方法之一。创建一个所需长度的数组,用字符填充它,然后传递给字符串构造函数:

\n\n
string RepeatWithArray(char c, int count)\n{\n    char[] chars = new char[count];\n    Array.Fill(chars, c);\n    return new string(chars);\n}\n
\n\n

为什么这么快? 因为我们直接操作内存:数组一次填充完成,而 new string(char[]) 构造函数只是将数据复制到字符串的内部缓冲区。没有多余的操作。

\n\n

性能:

博客

书籍推荐