String.Split返回奇怪的结果

时间:2014-03-11 01:40:11

标签: c# string split

我注意到如果我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或什么?

3 个答案:

答案 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个数字。每个空格将前一个数字与下一个数字分开。如果删除数字,结果数组将具有相同的长度。这是预期的。

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