字符串.Split返回奇怪的结果

本文关键字:结果 Split 返回 字符串 | 更新日期: 2023-09-27 17:49:19

我注意到,如果我通过只包含空白的空格来Split字符串,它会返回意想不到的结果。想想看:

var spaces = string.Join("",Enumerable.Repeat(" ", 10));
int lenght = spaces.Length; // 10
var result = spaces.Split(' ');
lenght = result.Length;  // 11

我不明白为什么result.Length返回11空字符串。而我有10空格在我的输入字符串?我还尝试了一个字母,例如"a",这没有任何区别:

var letters = string.Join("",Enumerable.Repeat("a", 10));
int lenght = letters.Length; // 10
var result = letters.Split('a');
lenght = result.Length;  // 11

在文档中说:

如果两个分隔符相邻,或者在此实例的开头或结尾找到分隔符,则相应的数组元素包含Empty。

所以我明白为什么我得到空字符串,但我不明白额外的元素是从哪里来的?

文档中有一个例子:

var input = "42..12..19";
var result = input.Split('.');

返回5个结果,其中两个是空字符串。不是 3

所以这是默认的和预期的行为,还是它是一个bug或什么?

字符串.Split返回奇怪的结果

不是错误,完全在意料之中。

这样看:

1-2-3

-上分割。这导致3个元素:1、2和3。

现在采取--3和分裂的短跑再次。还有3个元素,前2个为空。

分隔符本质上是位于其他两个元素之间的元素。它所在的元素可以为空。所以如果你有10个空格,然后在空格上分割,那么你就会有11个元素。

最后一个"42..12..19".上被分割的例子基本上是:42.EMPTY.12.EMPTY.19,这是5个元素。

在最后一个空格后匹配一个空元素。在最后一个示例中,在字符串的末尾放置.,即使只有5个分隔符,也会得到6个元素。事实上,看看这个例子——有5个元素,但只有4个分隔符。一般来说,你总是会有比分隔符数量多一个的元素,因为在每个分隔符之前会有一个元素,在最后一个分隔符之后会有一个元素。

考虑一下:

"1 2 3 4 5 6 7 8 9 10 11"

上面有10个空格,11个数字。每个空格分隔前一个数字和下一个数字。如果删除数字,生成的数组将具有相同的长度。

在您的示例中,字符串的开头是一个元素,直到第一个分隔符。由于分隔符是第一个字符,因此数组的第一个元素为空。然后,为每个额外的空格添加一个空数组项。