一些背景:
我目前正在学习C#并参与ChatBot
项目。 Chatbot
将从用户输入中学习,通过解析每个用户输入的句子,并将每个单词放入一个字典中,句子中的每个单词作为键,并将其后面的单词作为字典中的值。
我的第一个绊脚石是试图在字符串中循环以将单词放入字典中。
我的代码:
class Program
{
static string userInput;
static string val;
static string key;
static Dictionary<string, string> dict = new Dictionary<string, string>();
static void Main(string[] args)
{
userInput = Console.ReadLine();
string[] wordbits = userInput.Split(' ');
for (int i = 0; i < wordbits.Length; i++)
{
key = wordbits[i];
for (int j = 0; j < wordbits.Length; j++)
{
val = wordbits[(j + 1)];
}
dict.Add(key, val);
}
}
}
我得到的错误是IndexOutOfRangeException
,我认为这是因为循环在句子中的最后一个单词之后寻找一个单词,而这个单词并不存在。
有关如何解决此问题的任何建议吗?
答案 0 :(得分:1)
for (int j = 0; j < wordbits.Length; j++)
{
val = wordbits[(j + 1)];
}
这不起作用,你可以改为:
for (int j = 0; j < wordbits.Length-1; j++)
{
val = wordbits[(j + 1)];
}
或只是改变(但这会改变逻辑):
val = wordbits[j];
因为您在最后一次迭代访问wordbits[wordbits.Length]
时遇到异常,所以数组从0索引到长度为1
修改强>:
好吧,我明白了,你得到的价值如下:key value key value key value
,将你的逻辑改为:
for (int i = 0; i < wordbits.Length-1; i+=2)
{
key = wordbits[i];
val = wordbits[(i + 1)];
dict.Add(key, val);
}
它会为您的字典添加键和值。在你的逻辑内部再循环遍历所有的wordbits值,所以它不起作用,因为那里不需要循环。
答案 1 :(得分:0)
这里不需要这么多循环,只需传入key
,如果存在,则会更新该值,否则将添加新条目:
userInput = Console.ReadLine();
var matches = Regex.Matches(userInput,@"\w+\s+\w+");
foreach(Match m in matches){
if(m.Success){
var w = m.Value.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
dict[w[0]] = w[1];
}
}
请注意,代码不会检查用户的无效输入。所有输入应该是这样的:
word1 value1 word2 value2 word3 value3 ...
//after collecting matches, we will the following matches:
word1 value1
word2 value2
word3 value3
...