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

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

 string[] Split(string delimiter) 

然后就可以像

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

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

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

将问题调整为“为什么在使用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在上面的答案中所提到的,你需要停在某个地方并且有一种传递单个字符串的完美方法。

 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); }