如何在switch语句中使用字符串列表?

时间:2017-06-23 09:10:26

标签: c# visual-studio

我正在制作一个类似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;。任何帮助将不胜感激!

6 个答案:

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

}