我尝试在某些关键字与聊天机器人的输出相匹配后保持得分。我得到它来计算每场比赛的得分,但如果匹配相同的关键字,我不想再次匹配。我试图通过从列表中删除关键字来实现此目的,但它会继续添加分数。
即。如果聊天机器人打招呼,我想加分,但只有一次。
我要这个
public void SendQuestionToRobot()
{
if (string.IsNullOrEmpty(inputField.text) == false)
{
string answer = bot.getOutput(inputField.text);
robotOutput.text = answer;
inputField.text = "press enter to type";
List<string> sPattern = new List<string> { "hi", "a painkiller" };
foreach (string s in sPattern)
{
if (Regex.IsMatch(answer, s, RegexOptions.IgnoreCase))
{
controller.score += 5;
sPattern.Remove(s);
break;
}
}
}
}
和
public void SendQuestionToRobot()
{
if (string.IsNullOrEmpty(inputField.text) == false)
{
string answer = bot.getOutput(inputField.text);
robotOutput.text = answer;
inputField.text = "press enter to type";
List<string> sPattern = new List<string> { "hi", "a painkiller" };
foreach (string s in sPattern)
{
if (Regex.IsMatch(answer, s, RegexOptions.IgnoreCase))
{
controller.score += 5;
break;
}
}
foreach (string s in sPattern)
{
if (Regex.IsMatch(answer, s, RegexOptions.IgnoreCase))
{
sPattern.Remove(s);
}
}
}
}
但在这两种情况下都会继续添加分数
答案 0 :(得分:3)
通常情况如下:如果消除循环,就可以消除编写错误循环的可能性。不要写一个循环!
string match = sPattern.FirstOrDefault(
s => Regex.IsMatch(answer, s, RegexOptions.IgnoreCase));
if (match != null) {
controller.score += 5;
sPattern.Remove(match);
}
没有循环;没有循环问题。
答案 1 :(得分:0)
不要忘记在需要时更新sPattern。
List<string> sPattern = new List<string> { "hi", "a painkiller" };
public void SendQuestionToRobot()
{
if (string.IsNullOrEmpty(inputField.text) == false)
{
string answer = bot.getOutput(inputField.text);
robotOutput.text = answer;
inputField.text = "press enter to type";
foreach (string s in sPattern)
{
if (Regex.IsMatch(answer, s, RegexOptions.IgnoreCase))
{
controller.score += 5;
sPattern.Remove(s);
break;
}
}
}
}
答案 2 :(得分:0)
你在第二个foreach中忘了打破。你无法在Foreach中修改的集合上运行foreach !!!!枚举器只允许您阅读。修改集合后它变为无效。
foreach (string s in sPattern)
{
if (Regex.IsMatch(answer, s, RegexOptions.IgnoreCase))
{
sPattern.Remove(s);
break;
}
}