我正在创建一个聊天过滤器,我想删除所有潜在的不良词。我有一个由文本文件填充的字符串列表。然后,我允许用户输入他们的消息,并且我想检查他们的消息是否包含我所作列表中的错误词。我的问题是代码根本无法正常工作。布尔值“ 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);
}
}
答案 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();
}