5

次の表現があります。

"<p>What ?</p>\n<pre>Starting Mini</pre>"

次のように分割を実行すると:

   var split = content
      .Split(new[] { "<pre>", "</pre>" }, StringSplitOptions.None);

次に、次の 3 つのエントリが表示されます。

"<p>What ?</p>\n"
"Starting Mini"
""

3 番目のエントリとして空の行が表示されるのはなぜですか?どうすればこれを回避できますか?

4

8 に答える 8

5

「理由」は単純です: 入力 (空のエントリを削除しない場合) は、区切り文字が出現するたびに常に「分割」されるため、区切りn文字が文字列に複数回出現する場合、配列長くなりn+1ます。特に、これにより基本的に、元の文字列のどこに出現したかがわかります (ただし、複数の区切り記号を使用している場合、どれがどこに出現したかはわかりません)。

たとえば、簡単な例 (エスケープなしの csv など) を使用すると、次のようになります。

string[] arr = input.Split(','); // even if something like "a,b,c,d,"
// which allows...
int numberOfCommas = arr.Length - 1;
string original = string.Join(",", arr);

修正は、既に述べたように、 を使用することRemoveEmptyEntriesです。

于 2012-10-08T07:20:09.907 に答える
2

この動作は、Microsoft が指定したとおりです。 「隣接する区切り文字は、空の文字列 ("") を含む配列要素を生成します。」 したがって、最後のプレがあるので、最後の空の配列要素を取得します

于 2012-10-08T07:43:57.447 に答える
2

代わりに使用StringSplitOptions.RemoveEmptyEntriesして、リスト内の空の文字列を削除します

 var split = content
  .Split(new[] { "<pre>", "</pre>" }, StringSplitOptions.RemoveEmptyEntries);
于 2012-10-08T07:13:40.490 に答える
1

Mailou、「StringSplitOptions.None」を指定する代わりに、「StringSplitOptions.RemoveEmptyEntries」を試してください。空の行を削除します。

于 2012-10-08T07:17:26.200 に答える
1

この動作が発生する理由</pre>は、区切り文字の 1 つがたまたまstring の末尾に存在するためです。

次が表示される場合があります: string.Split - MSDN

...このインスタンスの先頭または末尾に区切り文字があり、対応する配列要素に空が含まれています

これを克服するには:

StringSplitOptions.RemoveEmptyEntriesの代わりに使用StringSplitOptions.None

StringSplitOptions.RemoveEmptyEntries - MSDN

戻り値には、空の文字列を含む配列要素は含まれません

 var split = content
       .Split(new[] { "<pre>", "</pre>" }, StringSplitOptions.RemoveEmptyEntries);
于 2012-10-08T07:14:25.793 に答える
0

StringSplitOptions.RemoveEmptyEntriesを使用して、分割 string[] 値に空の文字列が含まれないようにする

var split = content
  .Split(new[] { "<pre>", "</pre>" }, StringSplitOptions.RemoveEmptyEntries);

リファレンス: StringSplitOptions 列挙

于 2012-10-08T07:16:18.993 に答える
0

また、指定する必要があります

StringSplitOptions.RemoveEmptyEntries enumerator.
于 2012-10-08T07:14:23.257 に答える