4

私は明らかにここに何かが欠けています..

特定の文字列で区切られた部分文字列の数を返す関数を書いています。これはかなり単純な機能です -

public static FuncError DCount(String v1, String v2, ref Int32 result) {
        result = 0;
        if (String.IsNullOrEmpty(v1)) {
            return null;
        }
        if (String.IsNullOrEmpty(v2)) {
            return null;
        }

        int ct = 1;
        int ix = 0;
        int nix = 0;

        do {
            nix = v1.IndexOf(v2, ix);
            if (nix >= 0) {
                ct++;

                System.Diagnostics.Debug.Print(
string.Format("{0} found at {1} count={2} result = {3}",
v2, nix, ct, v1.Substring(nix,1)));
                ix = nix + v2.Length;
            }
        } while (nix >= 0);
        result = ct;
        return null;
    }

問題は、特定の状況で区切り文字として使用されている特殊文字で呼び出すと発生します。多くの誤検知を返しています。Debug.Print から、最初と最後の引数は常に同じでなければなりません。

þ found at 105 count=2 result = t
þ found at 136 count=3 result = t
þ found at 152 count=4 result = þ
þ found at 249 count=5 result = t
þ found at 265 count=6 result = t
þ found at 287 count=7 result = t
þ found at 317 count=8 result = t
þ found at 333 count=9 result = þ
þ found at 443 count=10 result = þ
þ found at 553 count=11 result = þ
þ found at 663 count=12 result = þ
þ found at 773 count=13 result = þ
þ found at 883 count=14 result = þ
þ found at 993 count=15 result = þ

þ を char として渡すと、正常に動作します。þ を区切り文字として使用して文字列を分割すると、正しい数の要素が返されます。誤って識別された 't' については、結果にピックアップされていない他の 't' があるため、文字変換の問題ではありません。

混乱している ...

ありがとう

4

3 に答える 3

6

ここでの問題は、異なる文化がどのようにキャラクターを表し、場合によってはそれらを組み合わせるかです。

あなたが探している文字Thornは、どうやらth文字で表すことができます。

LINQPadでこのコードを試してください:

void Main()
{
    string x = "uma thurman";
    x.IndexOf("þ").Dump();
}

を出力します4

(ノルウェーのマシンでこのプログラムを実行していることに注意してください。結果に影響がある場合とない場合があります)

これは、一部の文化では、2 つの S が一緒になった単語に見られる、2 つの S のドイツ語文字 - ß - と同じ「問題」です。

于 2013-03-19T13:13:20.057 に答える
3

StringComparison.Ordinal文化にとらわれない文字列マッチングを取得するために使用できます。

Lasse V. Karlsenのを使用:

string x = "uma thurman";
x.IndexOf("þ", StringComparison.Ordinal).Dump();

になり-1ます。

詳細については、.NET Framework で文字列を使用するためのベスト プラクティスを参照してください。

于 2013-03-19T13:35:28.520 に答える
0

次のオーバーロードをIndexOf使用しています。

現在のカルチャを使用して単語 (大文字と小文字を区別し、カルチャを区別する) 検索を実行します

CurrentCultureしたがって、結果はスレッドによって異なります。ほとんどの文化では、文字のとげth. ラッセの答えを見てください。

たとえば、Þórr と呼ばれる古い北欧の神は英語で Thor と書かれることが多く、最初の文字は "Thursday" (Thor's day) の "Th" と発音されます。

問題を解決するには、次のように変更v1.IndexOf(v2, ix)します。

v1.IndexOf(v2, ix, StringComparison.Ordinal)

そのオーバーロードに関するドキュメントを参照してください。

序数比較charは単純な方法で値を 1 つずつ比較し、単純に数値を比較します。対照的に、文化に依存する比較では、アクセント付き文字のさまざまな表現に関して、および文化が同等と見なすさまざまな文字に関して、多くの正規化が行われます。これは照合においても非常に重要です。たとえば、序数比較では、文字列は並べ替えの文字列の"naïve"に来ます (値が よりも高い数値を持っているため)。"nasty"System.Char'ï''s'

于 2013-03-19T13:40:29.670 に答える