8

是否有任何正当理由为什么没有String.Split接受分隔符字符串和要拆分的文本的重载?

string[] Split(string delimiter)

然后可以像这样使用

string input = "This - is - an - example";
string[] splitted = input.Split(" - ");
// results in:
//  { "This", "is", "an", "example" }

我真的知道,我可以很容易地创建一个扩展方法,但必须有正当的理由为什么没有添加它。

请注意,我不是在寻找如何使用字符串分隔符拆分字符串的解决方案,而是在寻找解释,为什么这样的重载会导致问题。这是因为我不认为它真的会引起问题,而且我发现初学者很难理解为什么我们必须传递一个实际string[]而不是简单string的分隔符。

4

2 回答 2

3

将问题调整为“为什么在使用 String[] 参数调用 String.Split() 时必须使用 StringSplitOptions 参数?” 可能会为您的问题提供答案。

请注意,实际上没有接受单个字符的 String.Split() 重载。重载需要一个 Char[],但由于它是一个 params 数组,您可以使用单个字符调用它,并且它被隐式转换为 Char[]。例如

"1,2,3,4,5".Split(',');

调用相同的 Split() 重载

"1,2,3,4,5".Split(new[] { ',' });

如果 Split() 的重载接受了 String[] 的单个参数,那么您将能够通过传递单个字符串参数来调用 Split。

但是,重载不存在,并且在将 String[] 传递给 Split 时必须使用 StringSplitOptions。至于为什么 StringSplitOptions 是强制性的,我只能推理,但可能是当用字符串拆分时,算法处理复杂拆分的可能性显着增加。为了为这些情况提供预期的结果,最好定义方法的行为,当找到多个彼此相邻的分隔符时。即 StringSplitOptions 是强制性的。

您可能会争辩说您可能会Split(String, StringSplitOptions)过载,但是正如 Ilya Ivanov 在上面的答案中提到的那样,您需要在某个地方停下来,并且有一种非常好的方法可以传入单个字符串。

于 2013-01-13T11:20:52.720 回答
-2
string input = "This - is - an - example";
string[] splitted = Regex.Split(input," - ");
foreach (string word in splitted)
{
    MessageBox.Show(word);
}

这不仅仅是空格的问题,它与你的string分隔符完全匹配,看

string input = "This,- is,- a,- complicated,- example";
string[] splitted = Regex.Split(input,",- ");
foreach (string word in splitted)
{
    MessageBox.Show(word);
}
于 2013-01-13T10:40:14.170 回答