1

foreachループで発生した問題の修正を誰かが手伝ってくれますか?私がやろうとしているのは、検索フレーズから禁止された単語を削除することです。禁止された単語はデータベースにあり、検索フレーズを分割して比較しようとしています。禁止リストの単語に対するフレーズの単語。

問題は、ifelseセクションが禁止された作業チェックにヒットしないことです。

助けてくれてありがとう。

                ///
                ///Banned Word List
                ///
                string newSearchPhrase      = string.Empty;
                string bannedWord           = string.Empty;
                var BannedWords             = _IGBW.BannedWords().ToList();

                bannedWord = BannedWords.ToString();

                foreach (string searchWords in TextClean.Split(' '))
                    {
                    if (bannedWord.ToLower() == searchWords.ToLower())
                        {
                        newSearchPhrase = Regex.Replace(searchWords, bannedWord, " ");
                        }
                    else
                        {
                        newSearchPhrase = searchWords;  
                        }
                    }

                string bannedWordsRemoved = newSearchPhrase;
4

3 に答える 3

2

これを行うとき:

bannedWord.ToLower() == searchWords.ToLower()

文字列を文字列と比較しているので、禁止されている単語が複数ある場合は、次のようなテストを行うことになります。

"bannedword1 bannedword2 bannedword3" == "bannedword1"

これは決して真実ではありません。

あなたが欲しいものは:

BannedWords.Contains(searchWords.ToLower())

または、禁止されている単語が必ずしも小文字であるとは限らない場合:

BannedWords.Select(word=>word.ToLower()).Contains(searchWords.ToLower())

また、newSearchPhrase文字列は常に上書きされるため、bannedWordsRemovedを設定した最後の行では、常に空の文字列または1単語の文字列に設定されます。

明確にするために編集:

            string newSearchPhrase      = string.Empty;
            var BannedWords             = _IGBW.BannedWords().ToList();

            foreach (string searchWord in TextClean.Split(' '))
                {
                if (!BannedWords.Select(word=>word.ToLower()).Contains(searchWord.ToLower()))
                    { 
                        newSearchPhrase += searchWord +" ";
                    }
                }

            string bannedWordsRemoved = newSearchPhrase;
于 2013-03-08T11:45:05.003 に答える
0

あなたの問題はこの行にあります:

bannedWord = BannedWords.ToString();

あなたが実際に欲しいのは:

bannedWord = string.Join(" ", BannedWords);

ただし、メソッド全体は次のようにクリーンな方法で記述できます。

var bannedWords = new HashSet<string>(_IGBW.BannedWords().ToList().Cast<string>(), StringComparer.OrdinalIgnoreCase);
var cleaned = string.Join(" ", TextClean.Split(' ').Where(w => !bannedWords.Contains(w)));
于 2013-03-08T11:36:41.913 に答える
0

検索文字列を単語に分割しているように思えます

    foreach (string searchWords in TextClean.Split(' '))

ただし、新しい検索文字列を作成するのではなく、1 つの単語のみを newSearchPhrase に割り当てます。

    newSearchPhrase = Regex.Replace(searchWords, bannedWord, " ");

    newSearchPhrase = searchWords;  

//jk

于 2013-03-08T11:42:48.390 に答える