Что я делаю не так с интерполяцией строк в c#? - PullRequest
0 голосов
/ 06 марта 2020

Что я делаю: Я пытаюсь построить словарь в одной функции (DictionaryBuilder), извлечь строку из указанного словаря и применить переменные к ней в другой функции (QuestionGenerator). Таким образом, каждый раз, когда вызывается QuestionBuilder, одна и та же строка будет возвращаться с различным содержанием без необходимости повторного преобразования одного и того же словаря.

        int a;
        int b;
        string theQuestion;
        string theAnswer;
        Dictionary<string, string> questionDict = new Dictionary<string, string>();

        void DictionaryBuilder()
        {
            questionDict.Add("0", $"What is {a} x {b} ?");
            questionDict.Add("1", $"The sum of {a} x {b} = {a*b}");
        }

        void QuestionGenerator()
        {
            Random rnd = new Random();
            a = rnd.Next(1, 10);
            b = rnd.Next(1, 10);
            theQuestion = questionDict["0"];
            theAnswer = questionDict["1"];
            Console.WriteLine(theQuestion);
            Console.WriteLine(theAnswer);
        }

Текущие результаты:"Что такое 0 x 0?» и «сумма 0 и 0 равна 0». Я не могу получить новые числа, которые будут применены.

Вопрос: Как мне сделать эту работу, чтобы я мог создавать словарь и переменные отдельно, чтобы каждый раз QuestionGenerator называется новый вопрос того же формата, предоставляется без необходимости многократно перестраивать словарь (который я считаю очень неэффективным)?

QuestionGenerator вызывается нажатием кнопки, чтобы генерировать новый вопрос в том же формате.

(Обратите внимание: фактический словарь и вычисления будут намного больше, более сложными, а вопросы и ответы не будут в одном словаре - это было только для пример простоты.)

Ответы [ 3 ]

4 голосов
/ 06 марта 2020

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

Dictionary<string, Func<string>> questionDict = new Dictionary<string, Func<string>>();

void DictionaryBuilder()
{
    questionDict.Add("0", () => $"What is {a} x {b} ?");
    questionDict.Add("1", () => $"The sum of {a} x {b} = {a*b}");
}

Затем установите переменные с помощью вызова этих функций:

theQuestion = questionDict["0"]();
theAnswer = questionDict["1"]();

Это позволяет вам запишите состояние дел (значения a и b) во время вызова функции.

2 голосов
/ 06 марта 2020

Создайте словарь, содержащий ваши строковые шаблоны

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

void DictionaryBuilder()
{
    questionDict.Add("0", "What is {a} x {b} ?");
    questionDict.Add("1", "The sum of {a} x {b} = {a*b}");
}

и затем используйте String.Format() в найденной строке, чтобы составить свой вопрос.

theQuestion = string.Format(questionDict["0"], a, b);
1 голос
/ 06 марта 2020

Обратите внимание, что строка интерполируется во время вызова DictionaryBuilder(). строки не "динамически" интерполируются.

Когда вы создаете свой словарь, строки рассчитываются один раз с начальными значениями в то время a и b, которые оба равны 0.

Вам необходимо создать небольшой однострочный метод для этого, например, вы можете использовать словарь, который хранит Func<string> вместо строки.

...