引言:为什么重复字符的问题成了经典
\n\n如果你曾经用 C# 写过代码,那么你肯定遇到过这样的任务:“我需要创建一个由 N 个相同字符组成的字符串”。看起来很简单,对吧?但正是这个问题在 Stack Overflow 上获得了 数千次浏览 和几十个回答。为什么?因为在看似简单的背后,隐藏着整个 性能优化 的世界和许多陷阱。
\n\n在这篇文章中,我们不仅仅展示如何在 C# 中重复字符。我们将从朴素的解决方案出发,一路走到在高负载系统中使用的专业技巧。你将了解哪种方法 最适合在不同场景下重复字符,以及为什么一些流行的建议实际上是有害的。
\n\n这篇文章对谁有用?
\n- \n
- 希望编写不仅可用而且高效的 C# 初学者开发者 \n
- 寻找 优化字符串操作 方法的有经验的程序员 \n
- 所有准备技术面试并希望展示对 .NET 内部机制深入了解的人 \n
问题:为什么不应该使用 for 循环
\n\n当新手听到“重复字符 N 次”时,首先想到的是 for 循环:
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 个字符来说,就是永恒。
让我们看看实际数据。用 count = 100,000 测试这个方法。在现代处理器上,这将花费……几秒钟。如果需要重复字符一百万次呢?程序就会“卡死”。
结论: 带拼接的循环是邪恶的。但还有其他更高效的方法。
\n\nC# 中重复字符的主要方法
\n\n让我们看看在 Stack Overflow 和实际项目中讨论的所有流行方法。我们将测试每种方法的性能,并分析何时使用哪种方法。
\n\n1. 经典的 StringBuilder
\n\n优化的第一步是使用 StringBuilder。它不会在每次添加时创建新字符串,而是使用缓冲区:
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 将不得不多次重新分配内存,从而降低性能。
性能: O(n)。对于 100,000 个字符,这个方法大约需要 ~1-2 毫秒。
\n\n2. 字符数组 + new string
\n\n这是 .NET 中 最快的方法之一。创建一个所需长度的数组,用字符填充它,然后传递给字符串构造函数:
\n\nstring 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[]) 构造函数只是将数据复制到字符串的内部缓冲区。没有多余的操作。
性能: