C# Split、Contains与if语句问题求助:生成单空格分隔字符串
你遇到的核心问题是:当用Split(' ')分割开头带空格的字符串时,会产生空字符串元素,而你的判断条件!item.Contains(" ")对空字符串同样成立(因为空字符串里没有空格),所以这些空字符串会被拼接成多余的空格,导致最终结果出现不必要的空格,甚至末尾也会多一个空格。
比如你的输入" WE ARE THE CHAMPIONS MY FRIEND"分割后,input2数组的第一个元素是空字符串,这个元素会触发result += item + " ",也就是往结果里加了一个空格,最后拼接出来的结果会是" WE ARE THE CHAMPIONS MY FRIEND "(开头和结尾都有多余空格),不符合预期。
这里有几种更可靠的处理方式,按推荐程度排序:
1. 使用Split的重载移除空元素 + String.Join(最简洁高效)
直接在分割时就去掉空元素,然后用String.Join一次性拼接,避免循环里的低效字符串拼接:
string input = " WE ARE THE CHAMPIONS MY FRIEND"; // 分割时移除所有空元素 string[] input2 = input.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); // 用单个空格拼接所有非空元素 string result = string.Join(" ", input2); Console.WriteLine(result); // 输出: WE ARE THE CHAMPIONS MY FRIEND
2. 修改循环内的判断条件
如果一定要保留循环的写法,把判断条件从!item.Contains(" ")改成!string.IsNullOrEmpty(item)(或者!string.IsNullOrWhiteSpace(item),如果要排除全是空白的元素):
string input = " WE ARE THE CHAMPIONS MY FRIEND"; string[] input2 = input.Split(' '); string result = ""; foreach (var item in input2) { // 只处理非空的元素 if (!string.IsNullOrEmpty(item)) result += item + " "; } // 最后去掉末尾多余的空格 result = result.TrimEnd(); Console.WriteLine(result); // 输出: WE ARE THE CHAMPIONS MY FRIEND
注意这里最后要加TrimEnd(),因为循环里每个元素都会加空格,最后一个元素后面也会多一个空格。
3. 使用Trim先处理输入字符串
先把输入字符串的首尾空格去掉,再分割,这样开头的空元素就不会出现了:
string input = " WE ARE THE CHAMPIONS MY FRIEND"; // 先去掉首尾空格 string trimmedInput = input.Trim(); string[] input2 = trimmedInput.Split(' '); string result = string.Join(" ", input2); Console.WriteLine(result); // 输出: WE ARE THE CHAMPIONS MY FRIEND
不过这种方式如果字符串中间有多个连续空格的话,分割后还是会有空元素,所以不如第一种方法可靠。
空字符串""本身不包含空格,所以!item.Contains(" ")的结果是true,会执行拼接操作,导致往结果里加了一个多余的空格。而我们真正需要过滤的是空的或者全是空白的元素,所以判断空字符串才是正确的逻辑。
内容的提问来源于stack exchange,提问作者Rick

