Проблема добавления в словарь в C # - PullRequest
0 голосов
/ 19 июля 2011

Хорошо, поэтому я выглядел очень усердно, но я не мог найти ответ на свою проблему. Должна быть проблема в моем коде, и было бы очень полезно, если бы кто-то мог посмотреть на это для меня.

       Dictionary<string, string> keylist = new Dictionary<string, string>();
            if (intext.Contains("addkey") && intext.Contains("def"))
        {

            string[] keywords = intext.Split(' ');
            string key1 = keywords[1];
            string def2 = keywords[3];
            string fkey = key1.Replace("_", " ");
            string fdef = def2.Replace("_", " ");
            keylist.Add(fkey, fdef);
            say("Phrase '" + fkey + "' added with response '" + fdef + "'");
            say("Your Dictionary contains " + keylist.Count.ToString() + " word(s).");
            //////////////////////////////



        }

Все, что я хочу, это взять ввод в виде «addkey key_here def Definition_here» и добавить его в словарь. Я добавил счетную часть для целей отладки, и она всегда говорит, что у меня есть только 1 слово в словаре, независимо от того, сколько я добавил. Вы, вероятно, можете сказать, что я новичок, поэтому, пожалуйста, будьте нежны. Спасибо

Ответы [ 4 ]

1 голос
/ 19 июля 2011

В указанном коде вы воссоздаете словарь каждый раз, когда запускаете его.

Dictionary<string, string> keylist = new Dictionary<string, string>();

Повторно инициализирует список ключей переменных в пустой словарь.

Вместо этого попробуйте переместить эту строку за пределы функции. Поскольку вы используете winforms, вы можете создать переменную уровня класса, примерно так:

public partial class Form1 : Form
{
    Dictionary<string, string> keylist = new Dictionary<string, string>();       

    public Form1()
    {
        InitializeComponent();
    }

    public void YourFunction(string intext)
    {
        if (intext.Contains("addkey") && intext.Contains("def"))        
        {            
            string[] keywords = intext.Split(' ');            
            string key1 = keywords[1];            
            string def2 = keywords[3];            
            string fkey = key1.Replace("_", " ");            
            string fdef = def2.Replace("_", " ");            
            keylist.Add(fkey, fdef);            
            say("Phrase '" + fkey + "' added with response '" + fdef + "'");            
            say("Your Dictionary contains " + keylist.Count.ToString() + " word(s)."); 
        }
    }

}
1 голос
/ 19 июля 2011
Dictionary<string, string> keylist = new Dictionary<string, string>();

Я предполагаю, что эта функция вызывается всякий раз, когда пользователь вводит какую-либо команду (например, из командной строки, когда они нажимают кнопку и т. Д.). Если это так, вам необходимо иметь словарь keylist на более высоком уровне (например, в качестве переменной экземпляра). Как теперь выглядит код, каждый раз, когда вызывается функция, создается новый словарь, и к нему добавляется ключ; Вот почему есть только один.

Во избежание неправильной оценки или упрощения вашей проблемы, простое перемещение строки, приведенной выше, за пределы тела функции должно помочь.

0 голосов
/ 19 июля 2011

Я не уверен точно, что ваша входная строка или как вам нужно ее использовать, хотя я думаю, что вы хотите разделить входную строку и пройти по этой строке ...

private Dictionary<string, string> GetData(string intext)
{
    Dictionary<string, string> keylist = new Dictionary<string, string>();

    string[] keywords = intext.Split(' ');
    foreach (string s in keywords)
    {
        if (s.Contains("addkey") && s.Contains("def"))
        {
            string fkey = key1.Replace("_", " ");
            string fdef = def2.Replace("_", " ");

            keylist.Add(fkey, fdef);
            say("Phrase '" + fkey + "' added with response '" + fdef + "'");
            say("Your Dictionary contains " + keylist.Count.ToString() + " word(s).");
        }
    }

    return keylist;
}
0 голосов
/ 19 июля 2011

Вам нужно перебрать блок if (intext.Contains...{}, или он запускается только один раз. Если вы просматриваете его и получаете только одну запись в Словаре, это потому, что вы продолжаете переназначать его в области видимости в сценарии, таком как:

while(true) {
    Dictionary<string, string> keylist = new Dictionary<string,string>();
    //...
}

Так что вам нужно переместить его наружу, если это ваш случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...