字符串.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或什么?
不是错误,完全在意料之中。
这样看:
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个数字。每个空格分隔前一个数字和下一个数字。如果删除数字,生成的数组将具有相同的长度。
在您的示例中,字符串的开头是一个元素,直到第一个分隔符。由于分隔符是第一个字符,因此数组的第一个元素为空。然后,为每个额外的空格添加一个空数组项。