作为标榜StringSplitOptions.RemoveEmptyEntries不起作用

问题描述 投票:26回答:7

我已经遇到好几次在过去,终于决定找出原因。

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应该避免。

c# .net string split
7个回答
37
投票

最有可能的,因为你改变分割后的字符串。你修剪值分裂他们之后,RemoveEmptyEntries不考虑串" "空。

下面将实现你想要的,基本上建立自己的条空元素:

var tagsSplit = tags.Split(',').
                  Select(tag => tag.Trim()). 
                  Where( tag => !string.IsNullOrEmpty(tag));

19
投票

相邻的分隔符产生包含一个空串(“”)的阵列元件。所述StringSplitOptions枚举的值指定了包含空字符串的数组元素是否包含在返回的数组英寸

" "通过定义不为空(它实际上是空格),所以它不会从所得的数组中删除。

如果您使用的.NET Framework 4,你可以解决,通过使用string.IsNullOrWhitespace method

var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                .Where(x => !string.IsNullOrWhiteSpace(x))
                .Select(s => s.Trim());

7
投票

RemoveEmptyEntries不意味着空间。 您的输入字符串包括许多“空间”。你应该注意到,“空间”是不是空的。在计算机,空间是一个特殊的ASCII码。这样的代码:

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

手段:

  1. 通过拆分输入“”并取出空项,不包括空间。所以,你得到了一些空间元素的数组。
  2. 然后,你修剪每个元素。空间元素成为空。

这就是为什么你得到它。


3
投票

尝试

var tagsSplit = tags.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);

这将逗号和空格吐,消除空字符串。


1
投票

我搜索也为清洁的方式拆分期间要排除的空格项,但由于所有选项似乎是某种变通办法,我选择循环阵列之上时将它们排除在外。

string[] tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string tag in tagsSplit.Where(t => !string.IsNullOrWhiteSpace(t))) { }

我想,这看起来更干净, - 作为奖励 - qazxsw POI可以省略。当然,只有当你可以循环刚刚拆分后不需要存储供以后使用的条目是一个选项。


1
投票

由于这是一个很普遍的需求,我继续和包裹在一个字符串扩展方法中最受欢迎的答案是:

.Split(...).ToArray()

要分割上“”为其他例子中,使用这样的:

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));
}

请注意,返回类型为IEnumerable的,所以您可以直接在返回的结果做更多​​的LINQ查询。如果你想结果转换到一个列表调用.ToList()。


0
投票
var result = yourString.Split_RemoveWhiteTokens(',')
热门问题
推荐问题
最新问题