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

时间:2012-05-21 09:04:54

标签: c# .net 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"
});

结果:

  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应该阻止它。

7 个答案:

答案 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());

意味着:

  1. 按','拆分输入,并删除空条目,不包括空格。所以 你有一个包含一些空间元素的数组。
  2. 然后你会修剪每个元素。空间元素变得空洞。
  3. 这就是你得到它的原因。

答案 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());