0

に複数の値がマップされているコンソール プログラムを作成していdictionary keyLookupます。キーを使用していくつかを出力するifコマンドを使用していますconsole.writeline = ("stuff");が、値とキーが同じ(辞書内)の場合にのみ機能します。これがなぜなのかわかりません。私は何を間違えたのかを理解しようとしていくつかの変数をいじっていlistましforeachたが、今でも機能し続けているにもかかわらず、私が望むようには機能しません。

またconsole.readline();、自分の辞書にない単語があると、すべてがクラッシュします。これは私が望んでいないことであり、ある時点でそうしなかったのと同じように、なぜそれを行ったのかわかりません。また、私のmathFunction辞書は、私の辞書が機能するように機能しkeyLookupます。違いは、リストを使用して相互参照する方法にあると思いますがkeyLookup

class MainClass
    {
        public static string Line;
        static string foundKey;
        public static void Main (string[] args)
        {
            while (true) 
            {
                if (Line == null)
                {Console.WriteLine ("Enter Input"); }
                WordChecker ();
            }
    }
    public static void WordChecker()
    {
        string inputString = Console.ReadLine ();
        inputString = inputString.ToLower();  

        string[] stripChars = { ";", ",", ".", "-", "_", "^", "(", ")", "[", "]",
            "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "\n", "\t", "\r" };

        foreach (string character in stripChars)
        {
            inputString = inputString.Replace(character, "");
        }
        // Split on spaces into a List of strings
        List<string> wordList = inputString.Split(' ').ToList();
        // Define and remove stopwords
        string[] stopwords = new string[] { "and", "the", "she", "for", "this", "you", "but" };

        foreach (string word in stopwords)
        {
            // While there's still an instance of a stopword in the wordList, remove it.
            // If we don't use a while loop on this each call to Remove simply removes a single
            // instance of the stopword from our wordList, and we can't call Replace on the
            // entire string (as opposed to the individual words in the string) as it's
            // too indiscriminate (i.e. removing 'and' will turn words like 'bandage' into 'bdage'!)
            while ( wordList.Contains(word) )
            {
                wordList.Remove(word);
            }
        }
        // Create a new Dictionary object
        Dictionary<string, int> dictionary = new Dictionary<string, int>();

        // Loop over all over the words in our wordList...

        foreach (string word in wordList)
        {
            // If the length of the word is at least three letters...

            if (word.Length >= 3) 
            {

                // ...check if the dictionary already has the word.

                if ( dictionary.ContainsKey(word) )
                {

                    // If we already have the word in the dictionary, increment the count of how many times it appears

                    dictionary[word]++;
                }
                else
                {
                    // Otherwise, if it's a new word then add it to the dictionary with an initial count of 1

                    dictionary[word] = 1;
                }
            }

            List<string> dicList = new List<string>();
            dicList = dictionary.Keys.ToList ();

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

            keyLookup["hey"] = "greeting";
            keyLookup["hi"] = "greeting";
            keyLookup["greeting"] = "greeting";
            keyLookup["math"] = "math";
            keyLookup["calculate"] = "math";
            keyLookup["equation"] = "math";

            foundKey = keyLookup[word];

            List<string> keyList = new List<string>();

            foreach (string keyWord in dicList)
            {
                if(keyWord == foundKey)
                {keyList.Add (keyWord); }
            }

            foreach (string mKey in keyList)
            {
            if(mKey == "greeting")
            {Greetings ();}

            if (mKey == "math") 
            {Math ();}
            }
        }
    }

    public static void Math()
    {
        Console.WriteLine ("What do you want me to math?");
        Console.WriteLine ("input a number");
        string input = Console.ReadLine ();

        decimal a = Convert.ToDecimal (input);
        Console.WriteLine("Tell me math function");
        string mFunction = Console.ReadLine();

        Console.WriteLine ("tell me another number");
        string inputB = Console.ReadLine();
        decimal b = Convert.ToDecimal (inputB);

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

        mathFunction["multiply"] = "multiply";
        mathFunction["times"] = "multiply";
        mathFunction["x"] = "multiply";
        mathFunction["*"] = "multiply";
        mathFunction["divide"] = "divide";
        mathFunction["/"] = "divide";
        mathFunction["subtract"] = "subtract";
        mathFunction["minus"] = "subtract";
        mathFunction["-"] = "subtract";
        mathFunction["add"] = "add";
        mathFunction["+"] = "add";
        mathFunction["plus"] = "add";

        string foundKey = mathFunction[mFunction];

        if (foundKey == "add")
        {
            Console.WriteLine (a + b);
        }
        else if (foundKey == "subtract")
        {
            Console.WriteLine (a - b);
        }
        else if (foundKey == "multiply")
        {
            Console.WriteLine (a * b);
        }
        else if (foundKey == "divide")
        {
            Console.WriteLine (a / b);
        }
        else
        {
            Console.WriteLine ("not a math");
        }
    }

    public static void Greetings()
    {
        Console.WriteLine("You said hello");
    }
}'
4

2 に答える 2

1

辞書を別の方法で反復処理する必要があります (ToList-Function を使用しないでください)。

代わりにこれを試してください:

foreach (KeyValuePair kvp (Of String, String) In testDictionary)
{
  Debug.WriteLine("Key:" + kvp.Key + " Value:" + kvp.Value);
}

このコードが原因で、単語が一致しない場合、アプリケーションがクラッシュします (そのように新しいエントリを作成していません)。

// Otherwise, if it's a new word then add it to the dictionary with an initial count of 1
dictionary[word] = 1;

編集:dictionary[word] = 1新しい要素を作成しないというのは間違っていました。こんな感じで全然いいです。

于 2013-05-25T20:23:17.447 に答える
0

foundKey = keyLookup[word];

wordkeyLookup に存在しない場合、クラッシュします。

string foundKey = mathFunction[mFunction];

mFunctionmathFunction に存在しない場合、クラッシュします。


これを「会話型」プログラムにしようとしている場合、ルックアップという言葉最も重要な部分です。述語や LINQ は使用しません。どちらも文字列関数を非常に簡単にすることができます。現在、辞書を使用しています。各キーワードにリストを使用しないのはなぜですか?

List<string> GreetingKeywords;
GreetingKeywords.Add("hello"); // ...

List<string> MathKeywords;
MathKeywords.Add("math"); // ...

foreach (var word in dicList)
{
  if (GreetingKeywords.Contains(word))
    { Greetings(); }
  if (MathKeywords.Contains(word))
    { Maths(); }
}

述語と、Find、IndexOf などのリスト/辞書関数について読むことをお勧めします。その知識は C# にとって非常に貴重です。

于 2013-05-26T02:10:19.093 に答える