在String.Split操作中指定空格的最佳方法

我正在分割一个基于空格的string,如下所示:

string myStr = "The quick brown fox jumps over the lazy dog"; char[] whitespace = new char[] { ' ', '\t' }; string[] ssizes = myStr.Split(whitespace); 

在我想要执行的代码中无处不在的地方定义char []数组是很烦人的。 是否有更高效的方式,不需要创build字符数组(如果在不同的地方复制,容易出错)?

如果你只是打电话给:

 string[] ssize = myStr.Split(null); 

要么:

 string[] ssize = myStr.Split(new char[0]); 

那么白色空间被认为是分裂字符。 从string.Split(char[])方法的文档页面 。

如果分隔符参数为null或不包含字符,则空白字符被假定为分隔符。 空白字符由Unicode标准定义,如果传递给Char.IsWhiteSpace方法,则返回true

总是总是阅读文档!

是的,这里还需要一个答案!

到目前为止,所有的解决scheme都是针对规范input的相当有限的领域,即:元素之间单个空白字符(尽pipe至less提到问题的提示是@cherno)。 但是我认为,除了最模糊的情况之外,所有这些都应该产生相同的结果:

 string myStrA = "The quick brown fox jumps over the lazy dog"; string myStrB = "The quick brown fox jumps over the lazy dog"; string myStrC = "The quick brown fox jumps over the lazy dog"; string myStrD = " The quick brown fox jumps over the lazy dog"; 

String.Split (在其他答案中显示的任何风格)根本无法正常工作,除非使用以下任一方法附加RemoveEmptyEntries选项:

 myStr.Split(new char[0], StringSplitOptions.RemoveEmptyEntries) myStr.Split(new char[] {' ','\t'}, StringSplitOptions.RemoveEmptyEntries) 

如图所示,当您使用RemoveEmptyEntries时,省略该选项会生成四个不同的结果(标记为A,B,C和D)与来自所有四个input的单个结果:

String.Split与Regex.Split

当然,如果你不喜欢使用选项,只需使用正则expression式:-)

 Regex.Split(myStr, @"\s+").Where(s => s != string.Empty) 

根据文件 :

如果分隔符参数为空或不包含字符,则空白字符被假定为分隔符。 空白字符由Unicode标准定义,如果传递给Char.IsWhiteSpace方法,则返回true。

所以只需调用myStr.Split(); 不需要传入任何东西,因为separator是一个params数组。

你为什么不使用?:

 string[] ssizes = myStr.Split(' ', '\t'); 

请注意,即使在使用String.Split(null)时,相邻的空格也不会被视为单个分隔符。 如果你的任何一个标记被多个空格或制表符分开,你将会得到数组中返回的空string。

从文档:

分隔符的每个元素都定义了一个单独的分隔符。 如果两个分隔符相邻,或者在此实例的开始或结尾处find分隔符,则相应的数组元素将包含空白。

所以不要复制和粘贴! 提取一个函数来分割和重用它。

 public static string[] SplitWhitespace (string input) { char[] whitespace = new char[] { ' ', '\t' }; return input.Split(whitespace); } 

代码重用是你的朋友。

你为什么不这样做:

 var ssizes = myStr.Split(" \t".ToCharArray()); 

看来在.NET 4.0中有一个方法String.ToCharArray()

编辑:正如VMAtm指出的, 该方法已经存在于.NET 2.0中!

你可以做:

 string myStr = "The quick brown fox jumps over the lazy dog"; string[] ssizes = myStr.Split(' '); 

MSDN有更多的例子和参考:

http://msdn.microsoft.com/en-us/library/b873y76a.aspx

你不能在内联吗?

 var sizes = subject.Split(new char[] { ' ', '\t' }); 

否则,如果你经常做这个确切的事情,你总是可以创build常量或包含该char数组的东西。

正如其他人已经注意到,你可以根据文档也使用null或一个空的数组。 当你这样做,它会自动使用空白字符。

 var sizes = subject.Split(null); 

如果重复相同的代码是问题,请在封装拆分逻辑的String类上编写扩展方法。