0

2 つの文字列を比較して、存在する単語の数を返したいこの関数がありますが、次の関数は機能しません。私は常に SameWordCount に対して 0 を取得し、MasterAddressWordCount に対して 1 を取得するようです

何か案は?

// some more string cleaning
        mastermkAddressKey = mastermkAddressKey.Replace(",", " ").Replace(".", " ").Trim();
        mastermkAddressKey = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(mastermkAddressKey));
        mastermkAddressKey = mastermkAddressKey.Replace("  ", " |").Replace("| ", "").Replace("|", "");
        mastermkAddressKey = QbaseStrings.RemoveDuplicateWords(mastermkAddressKey);

        duplicatemkAddressKey = duplicatemkAddressKey.Replace(",", " ").Replace(".", " ").Trim();
        duplicatemkAddressKey = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(duplicatemkAddressKey));
        duplicatemkAddressKey = duplicatemkAddressKey.Replace("  ", " |").Replace("| ", "").Replace("|", "");
        duplicatemkAddressKey = QbaseStrings.RemoveDuplicateWords(duplicatemkAddressKey);

        string[] masterAddressSeparateWords = mastermkAddressKey.Split(new char[' '], StringSplitOptions.RemoveEmptyEntries);
        string[] duplicateAddressSeparateWords = duplicatemkAddressKey.Split(new char[' '], StringSplitOptions.RemoveEmptyEntries);

        int SameWordCount = 0;
        int MasterAddressWordCount = 0;

        foreach (string masterWord in masterAddressSeparateWords)
                {
                    foreach (string duplicateWord in duplicateAddressSeparateWords)
                    {
                        if (masterWord == duplicateWord) {SameWordCount++;}
                    }

                    MasterAddressWordCount++;
                }

        int WordDifference = MasterAddressWordCount - SameWordCount;

        if (WordDifference == 0) { return "sure"; }
        if (WordDifference > 0 && WordDifference < 3) { return SameWordCount.ToString() + " " + MasterAddressWordCount.ToString(); }
        if (WordDifference > 2 && WordDifference < 5) { return "possible"; }
4

2 に答える 2

3

あなたの問題は が原因です。new char[' ']あなたがここで意味していたのはnew char[] {' '}です。コンパイラは(非常に役立つことに)ヒアに変換' 'して、それを. これは、次のことを意味します。intchar[int]

new char[' ']

本当に同じです:

new char[32]

char[]これは、あなたが求めていた単一のスペースではなく、大きな役に立たない配列になってしまいます。


生成された IL を見ると、これを明確に確認できます。

var a = new char[' '];

それは次のとおりです。

IL_0001:  ldc.i4.s    20
IL_0003:  newarr      System.Char
IL_0008:  stloc.0     // a

20 は 32 の 16 進表現です。

于 2014-02-20T02:18:28.037 に答える
0

次の行を変更して問題を解決しました。

string[] masterAddressSeparateWords = mastermkAddressKey.Split(new char[' '], StringSplitOptions.RemoveEmptyEntries);
        string[] duplicateAddressSeparateWords = duplicatemkAddressKey.Split(new char[' '], StringSplitOptions.RemoveEmptyEntries);

に:

string[] masterAddressSeparateWords = mastermkAddressKey.Split(' ');
string[] duplicateAddressSeparateWords = duplicatemkAddressKey.Split(' ');
于 2013-02-27T10:49:13.447 に答える