我正在制作一个类似siri的AI的控制台应用程序,它可以使用随机但适当的答案回答您的问题。我将这些答案和有效问题存储在用户可以在列表中查询的内容中,但我需要一种方法来检查用户提出的问题。我现在正在使用if语句,但我担心它会在以后开始引起问题,并占用比所需更多的空间。它看起来像这样:
if (question[0] == Console.ReadLine())
{
Console.Clear();
randIndex = rand.Next(0, 3);
Console.WriteLine(state[randIndex]);
Discussion();
}
if (question[1] == Console.ReadLine())
{
Console.Clear();
randIndex = rand.Next(0, 4);
Console.WriteLine(joke[randIndex]);
Discussion();
}
if (question[2] == Console.ReadLine())
{
Console.Clear();
randIndex = rand.Next(0, 2);
Console.WriteLine(yourName[randIndex]);
Discussion();
}
我尝试使用switch语句,这就是我这样做的方式:
for (int i = 0; i < question.Count; i++)
{
switch (question[i])
{
case 1:
Console.Clear();
randIndex = rand.Next(0, 3);
Console.WriteLine(state[randIndex]);
break;
}
}
这里唯一的问题是我在&#34; 1&#34;其中说&#34;不能隐含地转换类型&#39; int&#39;到&#39;字符串&#34;。我也试过更换 &#34;案例1&#34;用&#34;案例问题[0]:&#34;我得到一个错误,上面写着&#34;预期值为常数&#34;。任何帮助将不胜感激!
答案 0 :(得分:2)
我使用词典来提取并将所有案例合并为一个:
Dictionary<string, int> jokes = new Dictionary<string, int>(
StringComparer.OrdinalIgnoreCase) {
{ "question1", 3 },
{ "question2", 4 },
{ "question3", 2 },
....
};
...
int randMax = 0;
if (jokes.TryGetValue(Console.ReadLine(), out randMax)) {
Console.Clear();
randIndex = rand.Next(0, randMax);
Console.WriteLine(state[randIndex]);
Discussion();
}
答案 1 :(得分:2)
集合question
存储字符串而不是整数。所以你不能使用
switch (question[i])
{
case 1: // maybe "1", only you know
我建议使用不同的方法。根据用户的输入,似乎唯一的区别是Random.Next
的最大值。所以我会使用Dictionary<string, int>
:
var textMaxValDictionary = new Dictionary<string, int>()
{
{"sampletext1", 3}, {"sampletext2", 4}, {"sampletext1", 2}
};
现在你只需要这个:
string input = Console.ReadLine();
int maxValue;
bool inputMatchesOne = textMaxValDictionary.TryGetValue(input, out maxValue);
if(inputMatchesOne)
{
Console.Clear();
int randIndex = rand.Next(0, maxValue);
Console.WriteLine(joke[randIndex]);
Discussion();
}
else
{
Console.WriteLine("Tell user that was wrong...");
}
答案 2 :(得分:1)
正如您已经说过的那样,如果您以这种方式解决问题,代码将会针对您添加的每个问题不断增长。
为防止这种情况发生,您可以使用字典查找有效的回复:
Dictionary<string, string[]> questions= new Dictionary<string, string[]>();
questions["What's your name?"] = new string[] { "Siri", "Cortana", "Google", "Alexa" };
string asked = Console.ReadLine();
string[] responses;
if (!questions.TryGetValue(asked, out responses))
{
Console.WriteLine("I don't know what to say man");
return;
}
int index = rand.Next(0, responses.Length);
Console.WriteLine(responses[index]);
答案 3 :(得分:0)
您可以这样做,但只能使用C#7(VS2017提供)。那么你的代码可能会变成:
switch (Console.ReadLine())
{
case var s when s == questions[0]:
Console.Clear();
randIndex = rand.Next(0, 3);
Console.WriteLine(state[randIndex]);
Discussion();
break;
case var s when s == question[1]:
Console.Clear();
randIndex = rand.Next(0, 4);
Console.WriteLine(joke[randIndex]);
Discussion();
break;
case ...
}
但是这种语法实际上并没有提供超过多个if
语句的任何好处。因此,如果按照其他问题的建议并使用字典,你会好得多。
答案 4 :(得分:0)
switch语句不是唯一的&#34;问题&#34;用那段代码。例如,当没有重复代码时,你可以使事情变得更容易。
这样的东西会让它更容易维护。
假设你声明,笑话等属性类型为List<string>
,这可能会像这样(这只是一个可以通过例如使用方法更好/更短的想法)。
var allowedQuestions = new Dictionary<string, List<string>>
{
{ "question 1", state },
{ "question 1", joke },
{ "question 1", yourName }
};
var input = Console.ReadLine();
if(allowedQuestions.ContainsKey(input))
{
var answers = allowedQuestions[input];
var randIndex = rand.Next(0, answers.Count - 1);
Console.WriteLine(answers[randIndex]);
Discussion();
}
else
{
Console.WriteLine("no answer");
}
答案 5 :(得分:-1)
你可以用它。我希望它对你有用。
for (int i = 0; i < question.Count; i++)
{
if (question[i] == Console.ReadLine())
{
Console.Clear();
switch (i)
{
case 0:
randIndex = rand.Next(0, 3);
Console.WriteLine(state[randIndex]);
break;
case 1:
randIndex = rand.Next(0, 4);
Console.WriteLine(joke[randIndex]);
break;
case 2:
randIndex = rand.Next(0, 2);
Console.WriteLine(yourName[randIndex]);
break;
}
Discussion();
}
}