2017-06-23 63 views
-2

我正在製作一個siri-like AI的控制檯應用程序,使用隨機但合適的答案來回答您的問題。我將這些答案和有效問題存儲在列表中,但我需要一種方法來檢查用戶提出的問題。我現在正在使用if語句,但恐怕以後會開始引發問題,並佔用比需要更多的空間。它看起來像這樣:如何在switch語句中使用字符串列表?

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

這裏唯一的問題是,我發現了一個在「1」中出現錯誤,表示「不能將類型'int'隱式轉換爲'字符串'。我還嘗試用「案例問題[0]:」替換 「案例1」:「並且出現一個錯誤,指出」期望有一個常量值「。任何幫助,將不勝感激!

+0

'question'的類型是什麼? – Pikoh

+1

該消息是如此明確,你正在比較問題到一個int我的意思是一個字符串到一個int –

+1

我想它應該是'case'1「:或'case」SomeContent「:'? – jAC

回答

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

} 
+0

謝謝。這爲我正在嘗試做的工作。 – Aazo5

2

我sugest使用字典和所有的案件合併成一個:

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(); 
    } 
+0

我一定會看看這個,但我不明白這個代碼呢。 – Aazo5

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..."); 
} 
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]); 
+0

我很抱歉,但我還沒有真正熟悉字典。這就是我使用if語句或switch語句的原因。 – Aazo5

+0

@Aazo5沒關係,一步一步地做事。 –

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語句。所以你會更好地遵循其他問題的建議和使用字典。

0

switch語句不是這段代碼唯一的「問題」。例如,如果沒有重複代碼,你可以使事情變得更容易。

這樣的事情會使它更容易維護。 假設你的狀態,笑話等屬性是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"); 
} 
+0

歡迎來到俱樂部;-) –

+0

哦,猜我需要長時間寫一個答案:( –

相關問題