C# 字符串分割方法 C#如何使用Split分割字符串

来源:这里教程网 时间:2026-02-21 17:39:08 作者:

Split 方法的基本用法和默认行为

string.Split()
是 C# 中最常用的字符串分割方法,但它默认按空白字符(空格、制表符、换行等)拆分,且会跳过空项。如果你传入
null
或不传参数,它就走这个逻辑:

string text = "a  b\tc\n";
string[] parts = text.Split(); // 结果是 ["a", "b", "c"],中间所有空白都被合并处理

这容易让人误以为它“按空格切”,其实它识别的是

char.IsWhiteSpace()
范围内的所有字符。如果想严格按空格切,必须显式传入
new char[] { ' ' }

按指定字符或字符串分割,控制空项保留

实际开发中更常见的是按逗号、竖线或固定分隔符切,这时要小心空项处理——比如

"a,,b"
默认会变成
["a", "b"]
,丢掉中间的空字符串。

StringSplitOptions.None
保留所有结果项(含空字符串)
StringSplitOptions.RemoveEmptyEntries
(默认)跳过空项
若按字符串分割(如
"||"
),必须用
string[].Split(new string[] { "||" }, StringSplitOptions.None)
,不能直接传
"||"
string data = "apple||banana|||cherry";
string[] result = data.Split(new string[] { "||" }, StringSplitOptions.None);
// result[2] 是空字符串 "",result[3] 是 "cherry"

性能与 Unicode 注意点:避免用 params char[] 重载切长文本

当你写

text.Split('a', 'b', 'c')
,编译器调用的是
params char[]
重载,它会把每个字符当作独立分隔符(即“遇到 a 或 b 或 c 就切”)。这在语义上常不是你想要的,而且对大字符串有额外数组分配开销。

想按多个不同字符切(如空白+标点),用
char.IsSeparator()
或正则更清晰
想按固定字符串切(如
"\r\n"
),别错写成
text.Split('\r', '\n')
——那会把
"\r\n"
拆成两段,且中间内容错位
.NET 6+ 推荐优先用
Split(char, StringSplitOptions)
Split(string[], StringSplitOptions)
显式重载,避免隐式转换歧义

替代方案:Span.Split 和 ReadOnlySpan

对性能敏感场景(如高频日志解析),

Span<char></char>
版本可避免堆分配:

ReadOnlySpan<char> span = "a,b,c".AsSpan();
var parts = span.Split(','); // 返回 ReadOnlySpan<char>[],每个元素仍是 Span
// 注意:parts[i].ToString() 才能转成 string,但频繁调用仍可能触发分配

它不支持字符串分隔符,也不接受

StringSplitOptions
,空项总是保留。真正零分配需配合栈上缓存或预分配数组,这点容易被文档忽略。

相关推荐