为什么没有string.Split(字符串)重载?

时间:2013-01-13 10:27:31

标签: c# .net string split code-design

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

string[] Split(string delimiter)

然后可以像

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

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

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

2 个答案:

答案 0 :(得分:3)

调整问题&#34;为什么在使用String []参数调用String.Split()时,StringSplitOptions参数是强制的?&#34;可能会为你的问题提供答案。

请注意,实际上并不是一个接受单个字符的String.Split()重载。重载需要一个Char []但是因为它是一个params数组,你可以用一个字符调用它,它被隐式地转换为Char []。 e.g。

"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在上面的答案中所提到的,你需要停在某处,并且有一种传递单个字符串的完美方法。

答案 1 :(得分:-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);
}