2012-05-21 57 views
14

我在過去碰到過好幾次,最後決定找出原因。StringSplitOptions.RemoveEmptyEntries不能像廣告中那樣工作

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> 

所以它失敗,因爲不是 「三」,我們有一個空字符串 - StringSplitOptions.RemoveEmptyEntries應該避免什麼。

回答

26

很可能是因爲您在拆分後更改了字符串。您在分割它們之後修剪這些值,RemoveEmptyEntries不考慮字符串「」爲空。

下將實現你想要什麼,basicly創建自己帶空元素:

var tagsSplit = tags.Split(','). 
        Select(tag => tag.Trim()). 
        Where(tag => !string.IsNullOrEmpty(tag)); 
0
var splittedTags = tags.Split(',').Where(str=> str != String.IsNullOrWhiteSpace(str)).Select (s=>s.Trim()) 
12

相鄰的分隔符產生一個包含空 字符串(「」)一個數組元素。 StringSplitOptions枚舉的值指定 返回的數組是否包含 中包含空字符串的數組元素。

" "通過定義不爲空(它實際上是空白),所以它不會從所得的數組中刪除。

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

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

RemoveEmptyEntries不意味着空間。
您的輸入字符串包含許多「空格」。你應該注意到「空間」不是空的。在計算機中,空間是一種特殊的ASCII碼。這樣的代碼:

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

指:

  1. 拆分由輸入 '',並刪除空條目,不包括空間。所以 你有一個空間元素的數組。
  2. 然後你爲每個元素修剪。空間元素變空。

這就是爲什麼你得到它。

3

嘗試

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

這將逗號和空格吐,消除空字符串。

+0

這將錯誤地將OP輸入中的「Foo Bar」視爲兩個單獨的項目。 – Giles

-2

Value.Split(new char [] {'/'},StringSplitOptions.RemoveEmptyEntries);

這將由Slash分割。它工作得很好!

0

我也搜索了一個乾淨的方式來排除期間的空白條目Split,但由於所有選項都像是某種解決方法,因此我選擇在循環數組時排除它們。

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

我認爲這看起來更乾淨 - 作爲獎勵 - .Split(...).ToArray()可能是ommited。 當然,只有當您可以在分割後循環並且不必存儲條目以供以後使用時,它纔是選項。

相關問題