解析输入字符串并添加到字典中

时间:2013-11-20 10:36:46

标签: c# parsing loops dictionary

一些背景:

我目前正在学习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,我认为这是因为循环在句子中的最后一个单词之后寻找一个单词,而这个单词并不存在。

有关如何解决此问题的任何建议吗?

2 个答案:

答案 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
...