StringSplitOptions.RemoveEmptyEntries不像宣传的那样工作

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,它会删除空值和仅包含空格的值,同时修剪所有剩余的值。

  • 我发现这比接受的答案要好得多。 (2认同)

小智 7

RemoveEmptyEntries并不意味着空间.
您的输入字符串包含许多"空格".您应该注意到"空格"不是空的.在计算机中,空间是一种特殊的ASCII码.所以代码:

var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
    .Select(s => s.Trim());
Run Code Online (Sandbox Code Playgroud)

手段:

  1. 用','拆分输入,并删除空条目,不包括空格.所以你有一个带有一些空间元素的数组.
  2. 然后你会修剪每个元素.空间元素变得空洞.

这就是你得到它的原因.