为什么没有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); }