2012-05-21 9 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" 
}); 

結果: - StringSplitOptions.RemoveEmptyEntriesを防ぐ必要があります正確に何の代わりに "三" の、私たちは空の文字列を持っているので、

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

だから、失敗します。

答えて

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コードです。そのコードは: ''

  1. 分割して入力し、スペースを含め、空のエントリを削除しない:

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

    を意味します。だから いくつかのスペース要素を持つ配列があります。

  2. 次に、要素ごとにトリムします。スペース要素は空になります。

これはあなたがそれを持っている理由です。

3

これは、カンマとスペースで唾、および空の文字列を排除する

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

を試してみてください。

+0

これはOPの入力で2つの別々の項目として "Foo Bar"を誤って扱います。 – Giles

-2

Value.Split(新しいchar [] {'/'}、StringSplitOptions.RemoveEmptyEntries);

これはスラッシュで分割されます。それは完全にうまくいく!

0

を分割して除外するためのきれいな方法を探しましたが、すべてのオプションが何らかの回避策のように思えたので、配列をループする際に除外することにしました。ボーナスとして - -

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

私はこれがきれいに見えると考える.Split(...).ToArray()はommitedすることができます。 もちろん、分割した直後にループし、後で使用するためにエントリを保存する必要がない場合にのみオプションです。

関連する問題