【问题标题】:String.Split returns weird resultString.Split 返回奇怪的结果
【发布时间】:2014-03-11 01:40:11
【问题描述】:

我注意到如果我 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('.');

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

那么这是默认和预期的行为,还是错误或什么?

【问题讨论】:

    标签: c# string split


    【解决方案1】:

    不是错误,而是完全预期的行为。

    这样看:

    1-2-3

    - 上拆分。这导致 3 个元素:1,2 和 3。

    现在拿--3 并再次在破折号上分开。还有 3 个元素,前 2 个为空。

    分隔符本质上是一个位于其他两个元素之间的元素。它之间的元素可以是空的。因此,如果您有 10 个空格并按空格拆分,那么您将始终有 11 个元素。

    "42..12..19". 上拆分的最后一个示例本质上是:42.EMPTY.12.EMPTY.19 这是 5 个元素。

    【讨论】:

      【解决方案2】:

      它匹配最后一个空格后的空元素。在您的最后一个示例中,将 . 放在字符串的末尾,即使您只有 5 个分隔符,您也会得到 6 个元素。事实上,只要看看那个例子——有 5 个元素,但只有 4 个分隔符。通常,您总是会比分隔符的数量多一个元素,因为每个分隔符之前都会有一个元素,最后一个分隔符之后会有一个。

      【讨论】:

        【解决方案3】:

        考虑一下:

        “1 2 3 4 5 6 7 8 9 10 11”

        上面有10个空格,11个数字。每个空格将前一个数字与下一个数字分开。如果删除数字,生成的数组将具有相同的长度。这是意料之中的。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-08
          • 2012-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多