2011-02-07 11 views
16

今日、この問題に直面しています。なぜこのテストが失敗するのか(文化によって異なります)誰かが考えているのだろうかと思います。目的は、テストテキストに隣り合う2つのスペースが含まれているかどうかを確認することです。これはstring.IndexOfに従っています(文字列に2つのスペースがすべて隣り合うように置き換えても同じです)。いくつかのテストの後では、\xADが何とかこの問題を引き起こしているようです。string IndexOfとReplace

public class ReplaceIndexOfSymmetryTest 
{ 
    [Test] 
    public void IndexOfShouldNotFindReplacedString() 
    { 
     string testText = "\x61\x20\xAD\x20\x62"; 
     const string TWO_SPACES = " "; 
     const string ONE_SPACE = " "; 
     string result = testText.Replace(TWO_SPACES, ONE_SPACE); 
     Assert.IsTrue(result.IndexOf(TWO_SPACES) < 0); 
    } 
} 
+0

これはあなたの問題になるかどうかはわかりませんが、このテストで3つのスペースが隣り合っていると、最後に2つずつ隣り合わせになります。 –

+0

私のためにテストは成功します。投稿したコードが、テストしていたコードと同じであることを確認してください。 –

+0

問題は 'IndexOf'がカルチャ固有検索を使用し、' Replace'が序数検索を使用するという問題です。 @Chris:ポイントは失敗するということです。 –

答えて

16

はい、以前は同じ文字を使用しています(文字は異なるが)。基本的にIndexOfは、一致するものを見つけるときに "特別な" Unicode文字のさまざまな側面を考慮に入れますが、Replaceは文字列をコードポイントのシーケンスとして扱います。 IndexOf docsから

このメソッドは、現在の培養を用いて、単語(大文字と小文字を区別し、培養感受性)検索を実行します。検索はこのインスタンスの最初の文字位置から始まり、最後の文字位置まで続きます。

...とReplaceから:

この方法は、順序を実行する(大文字と小文字を区別し、培養非感受性)OLDVALUEを見つけるために検索します。

あなたはStringComparisonを取るIndexOfのオーバーロードを使用して、しかし序の比較を行うためにそれを強制できます。

+0

リフレクターをチェックインした後、デフォルトでStringComparison.CurrentCultureを使用しています。私は既にパラメータのデフォルトを避けることを学んだはずです。ありがとうジョン。 – ZFE

+0

[.Net Micro FrameworkのString.IndexOfのドキュメント](http://msdn.microsoft.com/en-us/library/hh400536.aspx)にも、検索は「大文字と小文字の区別があり、敏感な "。しかし残念なことに、netmfにはSystem.StringComparisonはなく、それを受け入れることができるString.IndexOfもありません。 – dumbledad