30

私は過去にこれに何度か遭遇し、ついにその理由を見つけることにしました。

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を防ぐ必要がありますか。

4

8 に答える 8

47

分割後に文字列を変更したことが原因である可能性があります。値を分割した後にトリミングします。文字列が空RemoveEmptyEntriesであるとは見なしません。" "

以下はあなたが望むものを達成し、基本的にあなた自身のストリップの空の要素を作成します:

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

隣接する区切り文字は、空の文字列( "")を含む配列要素を生成します。StringSplitOptions列挙体の値は、空の文字列を含む配列要素が返される配列に含まれるかどうかを指定します。

" "定義上、空ではないため(実際には空白です)、結果の配列から削除されません。

.net Framework 4を使用している場合は、string.IsNullOrWhitespaceメソッドを使用してこれを回避できます。

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は、2つの区切り文字が間に何もない状態で直接隣接している場合を意味します。このオプションを使用しない場合、この区切りを表す空白行が出力されます。「RemoveEmptyEntries」オプションを使用する場合、区切り文字の間に実際に何かがない限り、区切り文字は表示されません。空白スペースは、区切り文字の間の何かとしてカウントされます。試した場合:

One, Two,, Three,

RemoveEmptyEntriesこれにより、2つのコンマ間の区切りがなくなり、2から3に直接なります。

于 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 に答える