Foreach循环删除了太多的单词

时间:2013-03-08 11:34:50

标签: c# c#-4.0

任何人都可以帮我解决我在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;

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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)));

答案 2 :(得分:0)

在我看来,您正在通过

将搜索字符串拆分为单词
    foreach (string searchWords in TextClean.Split(' '))

但是你没有建立一个新的搜索字符串,只能在

上为newSearchPhrase指定单个单词
    newSearchPhrase = Regex.Replace(searchWords, bannedWord, " ");

    newSearchPhrase = searchWords;  

// JK