【问题标题】:Why isn't there a string.Split(string) overload? [closed]为什么没有 string.Split(string) 重载? [关闭]
【发布时间】:2013-01-13 10:27:31
【问题描述】:

有什么正当理由可以解释为什么String.Split 不接受分隔符字符串和要拆分的文本的重载?

string[] Split(string delimiter)

然后可以像这样使用

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

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

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

【问题讨论】:

  • 我想可以添加许多看似简单的方法,但这就是为什么您可以通过扩展方法添加自己的方法,正如您所指出的那样。
  • @HansPassant 我已经联系了Eric Lippert 关于这个,希望他能提供更多的见解。
  • @glosrob 虽然肯定有 1000 多个人们希望看到但没有提供的重载,但我认为 string.Split(string) 似乎是完全不费吹灰之力的,而且我也想知道是否有特定的原因不包括它。使用扩展方法处理这个问题仍然会涉及将字符串放入数组中的额外开销。
  • @Default 有一个公共联系表on his blog
  • 我不知道为什么 BCL 团队会做出这个决定。我个人觉得,Split 的每次重载都要求我在参数中创建垃圾,这很烦人。我的建议是你通过他们的博客询问 BCL 团队。这个问题需要读心来回答,因此很可能会被关闭。

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


【解决方案1】:

将问题调整为“为什么在使用 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 在上面的答案中提到的那样,您需要在某个地方停下来,并且有一种非常好的方法可以传入单个字符串。

【讨论】:

  • 第一个解决我的问题的答案,也是一个很好的答案。谢谢。
  • StringSplitOptions 真的没有那么先进,它的成员只有NoneRemoveEmptyEntries
【解决方案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);
}

【讨论】:

  • @GameScripting 你提供的链接并不能解释为什么不应该使用正则表达式,如果它不是关于正则表达式。
  • @Default 看看 cmets。他们说的完全一样。我认为使用Regex 分割字符串可能是confuse further developers,因为这里需要注意正则表达式。
  • 唯一的评论指出 “由于字符串不是真正的正则表达式,因此没有必要调用正则表达式解析器。” - 这不是为什么它的原因不应该使用(或者更确切地说,这是一个非常糟糕的恕我直言)。您提供的有关混淆进一步开发人员的链接确实让我感到困惑。下次,我可以建议你只解释你想说的话,而不是在我需要猜测你想说什么的地方使用 SO 答案。
  • 我这样做是为了证明我不是唯一一个持有这种观点的人。如果我想解释为什么一个人不应该使用某些东西,因为它不是为了那样使用而设计的,我必须写一篇关于它的博客文章,它不是关于一行的。既然所有这些事情都已经说明了,我指的是它们。不过,我会尽量听从您的建议,并尝试更清楚地表达我想说的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2011-10-21
  • 1970-01-01
  • 2020-05-03
  • 2014-06-27
  • 2014-03-22
相关资源
最近更新 更多