30

I've come across this several times in the past and have finally decided to find out why.

StringSplitOptions.RemoveEmptyEntries would suggest that it removes empty entries.

So why does this test fail?

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

The result:

  Values differ at index [2]
  Expected string length 5 but was 0. Strings differ at index 0.
  Expected: "Three"
  But was:  <string.Empty>

So it fails because instead of "Three", we have an empty string – exactly what StringSplitOptions.RemoveEmptyEntries should prevent.

4

8 回答 8

47

Most likely because you change the string after the split. You trim the values after splitting them, RemoveEmptyEntries doesn't consider the string " " empty.

The following would achieve what you want, basically creating your own strip empty elements:

var tagsSplit = tags.Split(',').
                  Select(tag => tag.Trim()). 
                  Where( tag => !string.IsNullOrEmpty(tag));
于 2012-05-21T09:07:12.713 回答
20

Adjacent delimiters yield an array element that contains an empty string (""). The values of the StringSplitOptions enumeration specify whether an array element that contains an empty string is included in the returned array.

" " by definition is not empty (it is actually whitespace), so it is not removed from resulting array.

If you use .net framework 4, you could work around that by using string.IsNullOrWhitespace method

var tagsSplit = tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                .Where(x => !string.IsNullOrWhiteSpace(x))
                .Select(s => s.Trim());
于 2012-05-21T09:18:03.480 回答
7

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

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

方法:

  1. 用 ',' 分割输入并删除空条目,不包括空格。所以你得到了一个包含一些空间元素的数组。
  2. 然后你对每个元素进行修剪。空间元素变为空。

这就是你得到它的原因。

于 2012-05-21T10:00:42.250 回答
3

尝试

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

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

于 2016-03-18T18:25:15.247 回答
1

我还搜索了一种在拆分期间排除空白条目的干净方法,但由于所有选项似乎都是某种解决方法,因此我选择在遍历数组时排除它们。

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

我认为这看起来更干净,并且 - 作为奖励 -.Split(...).ToArray()可能会被省略。当然,仅当您可以在拆分后循环并且不必存储条目以供以后使用时,它才是一个选项。

于 2017-01-18T16:52:31.860 回答
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()。

于 2019-02-02T18:02:11.150 回答
0

EmptyEntries这意味着两个定界符彼此直接相邻且中间没有任何内容的情况。如果不使用此选项,它将打印一个空白行来表示此分隔符。如果您使用“RemoveEmptyEntries”选项,它不会显示分隔符,除非分隔符之间确实存在某些内容。空格算作分隔符之间的内容。如果您尝试过:

One, Two,, Three,

您应该会发现RemoveEmptyEntries消除了两个逗号之间的分隔符,直接从二到三。

于 2022-01-12T10:29:42.790 回答
-1
var tagsSplit = tags.Split(',')
                    .Where(str => str != String.IsNullOrWhiteSpace(str))
                    .Select(s => s.Trim());
于 2012-05-21T09:16:43.870 回答