У програмуванні часто виникає потреба взаємодії з користувачем через введення та обробку даних. Особливо це стосується сценаріїв, де необхідно задавати користувачам кілька питань поспіль та отримувати їх відповіді. У мові програмування C# з використанням фреймворку Bot Framework це завдання можна вирішити за допомогою класу NumberPrompt.
NumberPrompt є частиною функціоналу Bot Framework і дозволяє запитувати від користувача цілі числа. Однак використання NumberPrompt для послідовних питань і відповідей може бути неочевидним завданням через специфіку асинхронного програмування та роботи з потоками в C#.
Припустимо, що у нас є база даних, з якої ми отримуємо список питань та їх варіантів відповідей. Ми хочемо задати користувачеві ці питання по черзі і отримати відповіді на кожне з них.
1 2 3 4 5 6 7 8 9 10 |
for (int i = 0; i < questions.Count; i++) { var showQuestionMessageText = $"Ось ваше питання: {questions[i]}"; var showQuestionMessage = MessageFactory.Text(showQuestionMessageText, showQuestionMessageText, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(showQuestionMessage, cancellationToken); var showOptionsMessageText = $"Ось ваші варіанти відповідей: \n1. {options[i][0]} \n2. {options[i][1]} \n3. {options[i][2]} \n4. {options[i][3]}"; var showOptionsMessage = MessageFactory.Text(showOptionsMessageText, showOptionsMessageText, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(showOptionsMessage, cancellationToken); return await stepContext.PromptAsync(nameof(NumberPrompt<int>), new PromptOptions { Prompt = MessageFactory.Text("Будь ласка, оберіть один із варіантів, використовуючи цифри від 1 до 4 для вводу вашої відповіді")}, cancellationToken); } |
У коді вище ми використовуємо цикл for для послідовного відображення кожного питання та його варіантів відповідей. Однак проблема полягає в тому, що цикл не чекає на відповідь користувача, і всі питання виникають одночасно.
Один із можливих підходів до вирішення цієї проблеми – використання рекурсії. Ми можемо створити метод, який буде задавати питання і чекати на відповідь користувача, а потім викликати цей метод рекурсивно для наступного питання.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
private async Task AskQuestion(int index, List<string> questions, List<string[]> options, WaterfallStepContext stepContext, CancellationToken cancellationToken) { if (index < questions.Count) { var showQuestionMessageText = $"Ось ваше питання: {questions[index]}"; var showQuestionMessage = MessageFactory.Text(showQuestionMessageText, showQuestionMessageText, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(showQuestionMessage, cancellationToken); var showOptionsMessageText = $"Ось ваші варіанти відповідей: \n1. {options[index][0]} \n2. {options[index][1]} \n3. {options[index][2]} \n4. {options[index][3]}"; var showOptionsMessage = MessageFactory.Text(showOptionsMessageText, showOptionsMessageText, InputHints.IgnoringInput); await stepContext.Context.SendActivityAsync(showOptionsMessage, cancellationToken); stepContext.Values["questionIndex"] = index; await stepContext.PromptAsync(nameof(NumberPrompt<int>), new PromptOptions { Prompt = MessageFactory.Text("Будь ласка, оберіть один із варіантів, використовуючи цифри від 1 до 4 для вводу вашої відповіді")}, cancellationToken); } } |
У цьому методі ми перевіряємо, чи є ще питання для задання. Якщо так, ми відображаємо питання та варіанти відповідей і очікуємо на відповідь користувача. Після отримання відповіді ми можемо викликати цей метод з індексом наступного питання.
Крім того, можна розглянути використання інших структур даних, таких як стек або черга, для послідовної обробки питань та відповідей, а також використання асинхронних методів для забезпечення правильного порядку виконання операцій.
Узагальнюючи, використання NumberPrompt для послідовних питань і відповідей у C# може бути реалізовано шляхом використання рекурсії або інших структур даних для правильного управління послідовністю питань та відповідей.