我过去曾经多次遇到这种情况,并最终决定找出原因。
StringSplitOptions.RemoveEmptyEntries
会建议删除空条目。
那么为什么这个测试会失败呢?
var tags = "One, Two, , Three, Foo Bar, , Day , ";
var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(s => s.Trim());
tagsSplit.ShouldEqual(new string[] {
"One",
"Two",
"Three",
"Foo Bar",
"Day"
});
结果:
Values differ at index [2]
Expected string length 5 but was 0. Strings differ at index 0.
Expected: "Three"
But was: <string.Empty>
所以它失败了,因为我们有一个空字符串而不是"Three"
,而StringSplitOptions.RemoveEmptyEntries
应该阻止它。
答案 0 :(得分:35)
最有可能的原因是您在拆分后更改了字符串。在拆分后修剪值,RemoveEmptyEntries
不认为字符串" "
为空。
以下将实现您想要的,基本上创建自己的strip空元素:
var tagsSplit = tags.Split(',').
Select(tag => tag.Trim()).
Where( tag => !string.IsNullOrEmpty(tag));
答案 1 :(得分:18)
根据定义,相邻分隔符会生成一个包含空的数组元素 string(“”)。 StringSplitOptions枚举的值指定 是否包含包含空字符串的数组元素 返回的数组。
" "
不为空(它实际上是空白),因此不会从结果数组中删除它。
如果您使用.net框架4,则可以使用string.IsNullOrWhitespace method
解决此问题var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Where(x => !string.IsNullOrWhiteSpace(x))
.Select(s => s.Trim());
答案 2 :(得分:7)
RemoveEmptyEntries并不意味着空间。
您的输入字符串包含许多“空格”。您应该注意到“空格”不是空的。在计算机中,空间是一种特殊的ASCII码。所以代码:
var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(s => s.Trim());
意味着:
这就是你得到它的原因。
答案 3 :(得分:3)
尝试
var tagsSplit = tags.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
这将用逗号和空格吐出,并消除空字符串。
答案 4 :(得分:1)
我还搜索了一种在拆分期间排除空白条目的简洁方法,但由于所有选项看起来都是某种变通方法,所以我选择在循环时排除它们阵列。
string[] tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string tag in tagsSplit.Where(t => !string.IsNullOrWhiteSpace(t))) { }
我认为这看起来更干净 - 作为奖励 - .Split(...).ToArray()
可能会被忽略。
当然,只有当您可以在拆分后循环并且不必存储条目供以后使用时,它才是一个选项。
答案 5 :(得分:1)
因为这是非常普遍的需求,所以我继续将最受欢迎的答案包装在字符串扩展方法中:
public static IEnumerable<string> Split_RemoveWhiteTokens(this string s, params char[] separator)
{
return s.Split(separator).
Select(tag => tag.Trim()).
Where(tag => !string.IsNullOrEmpty(tag));
}
要在','上分割,请使用其他示例:
var result = yourString.Split_RemoveWhiteTokens(',')
请注意,返回类型是IEnumerable,因此您可以直接在返回结果上执行其他LINQ查询。如果要将结果转换为列表,请调用.ToList()。
答案 6 :(得分:0)
var tagsSplit = tags.Split(',')
.Where(str => str != String.IsNullOrWhiteSpace(str))
.Select(s => s.Trim());