【问题标题】:Check if string is in list检查字符串是否在列表中
【发布时间】:2019-06-30 17:52:39
【问题描述】:

我正在创建一个聊天过滤器,我想删除任何潜在的坏词。我有一个由文本文件填充的字符串列表。然后我允许用户输入他们的消息,我想检查他们的消息是否包含我制作的列表中的坏词。我遇到的问题是代码根本不起作用。布尔值“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);
    }
}

【问题讨论】:

  • 我认为messageToSend完整 消息,而不仅仅是一个单词?
  • purgeWords 是否也转换为小写?
  • 什么是“purgeWords”?您为什么认为“purgeWords”包含(整个)messageToSend?
  • @streamlinemessageToSend 是完整的句子作为字符串。即使句子包含一个坏词,我也想禁止整个句子

标签: c#


【解决方案1】:

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

using System.Linq;

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

这种方式检查列表是否包含任何坏词,而不是列表是否包含整个句子。

【讨论】:

    【解决方案2】:

    如果没有找到坏词,我认为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();
    }
    

    【讨论】:

    • 我认为我已正确添加了此代码,但它仍然无法正常工作。这段代码正确吗?编辑:我不能添加代码太长-.-
    • @Jamie McClenaghan ...请使用完整的 winforms 示例检查我的更新答案。
    • 我现在唯一的问题就是这个。当我用其他词更新文档时,它将不起作用。旧话仍然有效,只是不再有效。但是,列表确实说里面有新词
    • 你是什么意思... “当我用其他词更新文档时它不会工作。”?什么“文件”?你不检查消息吗?你需要澄清这一点。
    • 编辑:忘记我说的话。我解决了这个问题。我遇到的问题是这适用于我发送的第一条消息。如果我发送一个坏词,它可以正常工作,但是对于我之后发送的每个坏词(即使它与第一个坏词相同)它都不起作用并且仍然发送消息
    【解决方案3】:

    purgeWords 是一个集合,而messageToSend 是需要检查purgeWords 的任何元素(比如单词)是否存在的字符串。所以你的if 条件应该这样做:

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

    【讨论】:

      【解决方案4】:

      看起来您正在检查坏词是否包含该消息,但实际上您需要检查该消息是否包含任何坏词。

      一种简单的方法是使用 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

      【讨论】:

      • 一种简单的方法是使用 linq var lowerCaseMessage = messageToSend.ToLower(); var containsBadWord = purgeWords.Any(badword =&gt; lowerCaseMessage.Contains(badword)); 。您还可以使用 RegEx 来检测或替换坏词。
      • 我刚刚尝试了这段代码,但它仍然不起作用。那就是如果我正确编码 void CheckMessage(string messageToSend) { var lowerCaseMessage = messageToSend.ToLower(); var isBadWord = purgeWords.Any(badword => lowerCaseMessage.Contains(badword)); if (isBadWord == true) { print("badword"); StartCoroutine(ClearMessageBadWord()); } else { SendText(messageToSend); } }
      • 你的坏词列表是全小写的吗?
      • 是的,伙计。都是小写的
      • 我刚刚写了一个运行良好的快速测试。我会将其包含在答案中以进行比较。
      猜你喜欢
      • 1970-01-01
      • 2013-01-09
      • 2013-04-29
      • 2017-03-22
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多