1

任何人都可以帮助解决我的 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;
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(' '))

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

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

    newSearchPhrase = searchWords;  

//jk

于 2013-03-08T11:42:48.390 回答