将关键字与answer匹配后从列表中删除关键字

时间:2017-07-05 15:29:49

标签: c#

我尝试在某些关键字与聊天机器人的输出相匹配后保持得分。我得到它来计算每场比赛的得分,但如果匹配相同的关键字,我不想再次匹配。我试图通过从列表中删除关键字来实现此目的,但它会继续添加分数。

即。如果聊天机器人打招呼,我想加分,但只有一次。

我要这个

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);

            }
        }
    }
}

但在这两种情况下都会继续添加分数

3 个答案:

答案 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;
        }
    }