检查字符串是否在列表中

时间:2019-06-30 17:52:39

标签: c#

我正在创建一个聊天过滤器,我想删除所有潜在的不良词。我有一个由文本文件填充的字符串列表。然后,我允许用户输入他们的消息,并且我想检查他们的消息是否包含我所作列表中的错误词。我的问题是代码根本无法正常工作。布尔值“ isBadWord”始终返回valse。有人可以帮我吗?

我确保文本文档正确加载,并且列表中确实填充了不允许的单词。

void CheckMessage(string messageToSend)
{


    bool isBadWord;
    if (purgeWords.Contains(messageToSend.ToLower()))
    {
        isBadWord = true;
    }
    else
    {
        isBadWord = false;
    }


    if (isBadWord == true)
    {
        print("badword");
        StartCoroutine(ClearMessageBadWord());
    }
    else
    {
        SendText(messageToSend);
    }
}

4 个答案:

答案 0 :(得分:1)

由于messageToSend包含您要检查的完整句子,因此您必须执行以下操作:

using System.Linq;

if (messageToSend.Split(' ').Any(word => purgeWords.Contains(word.ToLower())))
{
    isBadWord = true;
}

通过这种方式,可以检查列表中是否包含任何不良词,而不是列表中是否包含整个句子。

答案 1 :(得分:0)

您似乎正在检查badwords是否包含该消息,但实际上您需要检查该消息是否包含任何badwords。

一种简单的方法是使用linq。

var lowerCaseMessage = messageToSend.ToLower(); 
var containsBadWord = purgeWords.Any(badword => lowerCaseMessage.Contains(badword));

示例:

    class Program
    {
        static List<string> purgeWords = new List<string> { "badword", "anotherBadWord" };
        static void Main(string[] args)
        {
            var message = "a string containing badword";
            Console.WriteLine(CheckMessage(message));
        }

        static bool CheckMessage(string messageToSend)
        {
            var lowerCaseMessage = messageToSend.ToLower();
            return purgeWords.Any(badword => lowerCaseMessage.Contains(badword));
        }
    }

结果:True

答案 2 :(得分:0)

List<string> sortStringListByArray(List<string> unsortedList, string[] order) { List<string> sortedList = new List<string>(); for(int i = 0; i < order.Length; i++) { foreach(string s in unsortedList) { if(s.Equals(order[i])) { sortedList.Add(s); } } } return sortedList; } 是一个集合,而purgeWords是一个字符串,其中需要检查messageToSend的任何元素(例如单词)的存在。因此,您的purgeWords条件应该这样做:

if

答案 3 :(得分:0)

我认为,如果没有发现不好的话,CheckMessage方法将简单地返回true。我建议您更改此方法以返回true / false,具体取决于是否在消息中找到了错误的单词。像下面这样……

private bool MessageHasBadWord(string messageToSend) {
  string[] wordsToCheck = messageToSend.Split(' ');
  foreach (string word in wordsToCheck) {
    if (purgeWords.Contains(word.ToLower())) {
      return true;
    }
  }
  return false;
}

此方法在SPACES上拆分消息以获取每个单词。然后,简单地循环遍历这些单词,并检查其中是否有任何一个单词是不好的单词,如果找到了错误的单词,则简单地返回true,否则找到false。对该方法的调用可能看起来像…。

if (MessageHasBadWord(messageToSend)) {
    MessageBox.Show("Message has a bad word");
  }
  else {
    MessageBox.Show("Message is OK no bad words found");
  }

下面是一个完整的小型winforms示例...将TextBox拖放到新表单上,然后将Button放在文本框中检查消息。

List<string> purgeWords = new List<string>();

public Form1() {
  InitializeComponent();
}

private List<string> GetPurgeWords() {
  List<string> pwords = new List<string>();
  pwords.Add("BadWord1".ToLower());
  pwords.Add("BadWord2".ToLower());
  pwords.Add("BadWord3".ToLower());
  pwords.Add("BadWord4".ToLower());
  pwords.Add("BadWord5".ToLower());
  return pwords;
}

private void button1_Click(object sender, EventArgs e) {
  if (MessageHasBadWord(textBox1.Text)) {
    MessageBox.Show("Message has a bad word");
  }
  else {
    MessageBox.Show("Message is OK no bad words found");
  }
}

private bool MessageHasBadWord(string messageToSend) {
  string[] wordsToCheck = messageToSend.Split(' ');
  foreach (string word in wordsToCheck) {
    if (purgeWords.Contains(word.ToLower())) {
      return true;
    }
  }
  return false;
}

private void Form1_Load(object sender, EventArgs e) {
  purgeWords = GetPurgeWords();
}