我注意到如果我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
在documentation中说:
如果两个分隔符相邻,或者在此实例的开头或结尾处找到分隔符,则相应的数组元素包含Empty。
所以我理解为什么我得到空字符串,但我不明白这个额外元素来自哪里?
文档中有一个例子:
var input = "42..12..19";
var result = input.Split('.');
返回五个结果,两个是空字符串。不三。
这是默认和预期的行为,还是一个bug或什么?
答案 0 :(得分:8)
不是错误和完全预期的行为。
这样看:
1-2-3
分开-
。这导致3个元素:1,2和3。
现在取--3
并再次拆分破折号。还有3个元素,前两个元素为空。
分隔符本质上是两个其他元素之间的元素。它之间的元素可以是空的。因此,如果你有10个空格并且在空格上分裂,那么你将总是有11个元素。
"42..12..19"
上.
分割的最后一个示例基本上是:42.EMPTY.12.EMPTY.19
这是5个元素。
答案 1 :(得分:2)
它匹配最后一个空格后的空元素。在上一个示例中,将.
放在字符串的末尾,即使您只有5个分隔符,也会获得6个元素。事实上,只看一下这个例子 - 有5个元素,但只有4个分隔符。通常,你总是会有一个元素而不是分隔符的数量,因为在每个分隔符之前会有一个元素,而在最后一个分隔符之后会有一个元素。
答案 2 :(得分:2)
考虑一下:
“1 2 3 4 5 6 7 8 9 10 11”
上面有10个空格,11个数字。每个空格将前一个数字与下一个数字分开。如果删除数字,结果数组将具有相同的长度。这是预期的。
在您的示例中,字符串的开头是一个元素,直到第一个分隔符。由于分隔符是第一个字符,因此数组的第一个元素为空。之后,为每个额外的空间添加了一个空数组项。