在 .NET 中将字符串拆分为行:5 个致命错误及其解决方案

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

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

开始课程

引言:为什么简单的字符串拆分会成为令人头疼的问题?

\n

看起来,将文本拆分为行能有多难?任何 C# 新手都会说:“使用 string.Split('\\n') 就搞定了!”。但在实践中,正是这个看似简单的任务成为了我们在 Stack Overflow 上看到的数百个错误的根源。每天都有成千上万的开发者问同一个问题:“在 .NET 中按换行符拆分字符串——为什么我的代码不工作?”

\n

在本文中,我们不仅会给出现成的解决方案。我们还会回顾那些即使是经验丰富的程序员也会踩到的坑。您将了解如何根据不同平台、编码和意外的文件格式正确地拆分字符串。请系好安全带——这将既痛苦又实用。

\n\n

在 C# 中将字符串拆分为行时的 5 大常见错误

\n\n

1. 天真地使用 '\\n'——跨平台性的杀手

\n

最常见的错误是硬编码换行符。许多人这样写:

\n
string text = "第一行\\n第二行\\n第三行";\nstring[] lines = text.Split('\\n');
\n

问题: 在 Windows 中,标准分隔符是 "\\r\\n"(回车 + 换行),而在 Linux/macOS 中只是 '\\n'。如果您从 Windows 创建的文件中获取文本,您的代码会在每行末尾留下 '\\r' 字符。结果:"第一行\\r"——您的解析器会因此混乱。

\n

解决方案: 使用 StringSplitOptions.RemoveEmptyEntries 并针对所有可能的变体进行拆分:

\n
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n    StringSplitOptions.RemoveEmptyEntries);
\n

这段代码将正确处理任何换行符的组合。

\n\n

2. 在运行时忽略 Environment.NewLine

\n

如果您编写的代码将在 Windows 和 Linux 上运行(例如 ASP.NET Core 应用程序),则不能依赖常量。Environment.NewLine 返回当前操作系统的正确分隔符,但不能保证输入数据与该操作系统匹配。

\n

陷阱: 您这样写:

\n
string[] lines = text.Split(Environment.NewLine);
\n

这仅在文本是在同一平台上创建时才有效。如果您加载从互联网下载的文件(其中行可能采用 Unix 风格)——恭喜,Bug 来了!

\n

最佳实践: 无论平台如何,始终使用第 1 点中的通用方法。

\n\n

3. 忘记使用 StringSplitOptions.RemoveEmptyEntries

\n

看看这段代码:

\n
string text = "行1\\n\\n行3";\nstring[] lines = text.Split('\\n');\n// 结果:["行1", "", "行3"]
\n

由于两个连续的换行符,“行1”和“行3”之间会出现空字符串。如果您处理 CSV、日志或配置文件,空行可能会破坏逻辑。

\n

解决方案:

\n
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n    StringSplitOptions.RemoveEmptyEntries);\n// 结果:["行1", "行3"]
\n

但请注意:如果空行有意义(例如在格式化文本中),请使用 StringSplitOptions.None。

\n\n

4. 末尾换行符的问题

\n

假设您有一个包含以下文本的文件:

\n
行1\\n行2\\n
\n

许多人期望拆分后得到一个包含两个元素的数组。但是:

\n
string[] lines = text.Split(new[] { '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n// 结果:["行1", "行2"]
\n

这是正确的。但如果去掉 RemoveEmptyEntries 呢?

\n
string[] lines = text.Split('\\n');\n// 结果:["行                

博客

书籍推荐