Foreach循环删除了太多单词

本文关键字:太多 单词 删除 循环 Foreach | 更新日期: 2023-09-27 18:03:02

有没有人可以帮助解决我与我的foreach循环的问题,我要做的是从搜索短语中删除被禁止的单词,被禁止的单词在数据库中,然后我分割搜索短语并试图将短语中的单词与禁用列表中的单词进行比较。

问题在if else部分,它没有击中禁止的工作检查。

谢谢你的帮助。

                ///
                ///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;

Foreach循环删除了太多单词

当你这样做的时候:

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;

在我看来你是在用

把搜索字符串分割成单词
    foreach (string searchWords in TextClean.Split(' '))

但是您并没有建立一个新的搜索字符串,您只是将单个单词分配给newSearchPhrase at

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

    newSearchPhrase = searchWords;  

//jk

你的问题出在这一行:

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)));