2017-07-05 2 views
0

特定のキーワードがチャットボットの出力と一致した後もスコアを維持しようとしています。私はすべての試合のスコアを数えるようにしましたが、同じキーワードと一致するものがあれば、再び一致させたくありません。私はリストからキーワードを削除することでこれをやろうとしていますが、スコアを追加し続けます。キーワードを回答と一致させた後にリストからキーワードを削除する

つまり、チャットボットが「ハイ」と言っても、1回だけスコアを追加します。

私はこの

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

毎回リストを再作成します。あなたはそれを一生長いものに一度ロードする必要があります(グローバル変数、クラスメンバ) – pm100

+0

完璧、それは働いた!どうもありがとうございます! – Piotr

+0

代わりに 'for'ループを使わない方がいいでしょう。 – garfbradaz

答えて

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; 
      } 
     } 
    } 
} 
0

あなたは第二のforeachでブレークを忘れてしまいました。 Foreach内で変更するコレクションに対してforeachを実行することはできません。列挙子はあなただけが読むことができます。コレクションを変更すると無効になります。

foreach (string s in sPattern) 
    { 

     if (Regex.IsMatch(answer, s, RegexOptions.IgnoreCase)) 
     { 
      sPattern.Remove(s); 
      break; 
     } 
    } 
3

多くの場合、ループを削除すると、バグのあるループを作成する可能性がなくなります。ループを一切書き込まないでください!

string match = sPattern.FirstOrDefault(
    s => Regex.IsMatch(answer, s, RegexOptions.IgnoreCase)); 
if (match != null) { 
    controller.score += 5; 
    sPattern.Remove(match); 
} 

ループなし。ループの問題はありません。

関連する問題