Ben*_*ter 28 .net c# string split
我过去曾经多次遇到这个问题,并最终决定找出原因.
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"
});
Run Code Online (Sandbox Code Playgroud)
结果:
Values differ at index [2]
Expected string length 5 but was 0. Strings differ at index 0.
Expected: "Three"
But was: <string.Empty>
Run Code Online (Sandbox Code Playgroud)
所以它失败了,因为"Three"
我们有一个空字符串 - 确切地说StringSplitOptions.RemoveEmptyEntries
应该防止它.
TJH*_*vel 40
很可能因为您在拆分后更改了字符串.在拆分后修剪值,RemoveEmptyEntries
不认为字符串为" "
空.
以下将实现您想要的,基本上创建自己的strip空元素:
var tagsSplit = tags.Split(',').
Select(tag => tag.Trim()).
Where( tag => !string.IsNullOrEmpty(tag));
Run Code Online (Sandbox Code Playgroud)
arc*_*hil 19
相邻的分隔符产生一个包含空字符串("")的数组元素.StringSplitOptions枚举的值指定返回的数组中是否包含包含空字符串的数组元素.
" "
根据定义,它不是空的(实际上是空格),因此不会从结果数组中删除它.
如果使用.net framework 4,则可以使用string.IsNullOrWhitespace方法解决此问题
var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Where(x => !string.IsNullOrWhiteSpace(x))
.Select(s => s.Trim());
Run Code Online (Sandbox Code Playgroud)
Dan*_*Dan 12
在 .NET 5 中,他们添加了StringSplitOptions.TrimEntries
.
既然StringSplitOptions
有[System.Flags]
属性,那就意味着你可以写
var tagsSplit = tags.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
Run Code Online (Sandbox Code Playgroud)
当同时指定RemoveEmptyEntries
和 时TrimEntries
,它会删除空值和仅包含空格的值,同时修剪所有剩余的值。
小智 7
RemoveEmptyEntries并不意味着空间.
您的输入字符串包含许多"空格".您应该注意到"空格"不是空的.在计算机中,空间是一种特殊的ASCII码.所以代码:
var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(s => s.Trim());
Run Code Online (Sandbox Code Playgroud)
手段:
这就是你得到它的原因.