Повторное выполнение функции на C # - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть этот простой код с переключателем. Дело в том, что после завершения любого дела или по умолчанию код завершается. То, что я хочу получить после завершения, это задаст вопрос «Хотите ли вы повторить?», И если ответ «Y», он снова запустит Main, а «N» завершится, и так далее. Я пытался сделать ... пока и не повезло, другие предложения?

Я уверен, что это должно выглядеть примерно так:

Console.WriteLine("Would you like to repeat? Y/N");

input = Console.ReadKey().KeyChar;

if (input == 'Y') {...}

Код:

class Switch
{
    static void Main()
    {
        Console.Write("Enter your selection (1, 2, or 3): ");
        string s = Console.ReadLine();
        int n = Int32.Parse(s);

        switch (n)
        {
            case 1:
                Console.WriteLine("Current value is {0}", 1);
                break;
            case 2:
                Console.WriteLine("Current value is {0}", 2);
                break;
            case 3:
                Console.WriteLine("Current value is {0}", 3);
                break;
            default:
                Console.WriteLine("Sorry, invalid selection.");
                break;
        }

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}

.

Ответы [ 4 ]

0 голосов
/ 02 ноября 2018

Спасибо всем. Мне удалось пометить оба ответа и добиться успеха. Вот как этот код выглядит сейчас, и он на самом деле работает так, как я хочу.

using System;

class Switch
{
static void Main()
{
bool repeat;
char input ;
do {
    Console.Write("Enter your selection (1, 2, or 3): ");
    string s = Console.ReadLine();
    int n = Int32.Parse(s);

    switch (n)
    {
        case 1:
            Console.WriteLine("Current value is {0}", 1);
            break;
        case 2:
            Console.WriteLine("Current value is {0}", 2);
            break;
        case 3:
            Console.WriteLine("Current value is {0}", 3);
            break;
        default:
            Console.WriteLine("Sorry, invalid selection.");
            break;
    }

Console.WriteLine("Would you like to repeat? Y/N");
input = Convert.ToChar(Console.ReadLine());

    }
  while (input == 'y');

 Console.WriteLine("Press any key to exit.");
 Console.ReadKey();

}  


}
0 голосов
/ 01 ноября 2018

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

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

public static async Task Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

        var startup = new Startup();

        var hostBuilder = new HostBuilder()
            .ConfigureHostConfiguration(startup.ConfigureHostConfiguration)
            .ConfigureAppConfiguration(startup.ConfigureAppConfiguration)
            .ConfigureLogging(startup.ConfigureLogging)
            .ConfigureServices(startup.ConfigureServices)
            .Build();

        await hostBuilder.RunAsync();
    }

Добавление ссылки на пакет nuget в Microsoft.Extensions.Hosting.

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

<LangVersion>latest</LangVersion>

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

using MassTransit;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Trabalhos.EventsEngine.Messages;

namespace Trabalhos.EventsEngine.ClientExample
{
    public class SenderHostedService : IHostedService
    {
        private readonly IBusControl eventsEngine;
        private readonly ILogger<SenderHostedService> logger;

        public SenderHostedService(IBusControl eventsEngine, ILogger<SenderHostedService> logger)
        {
            this.eventsEngine = eventsEngine;
            this.logger = logger;
        }

        public async Task StartAsync(CancellationToken cancellationToken)
        {
            var products = new List<(string name, decimal price)>();

            Console.WriteLine("Welcome to the Shop");
            Console.WriteLine("Press Q key to exit");
            Console.WriteLine("Press [0..9] key to order some products");
            Console.WriteLine(string.Join(Environment.NewLine, Products.Select((x, i) => $"[{i}]: {x.name} @ {x.price:C}")));
            for (;;)
            {
                var consoleKeyInfo = Console.ReadKey(true);
                if (consoleKeyInfo.Key == ConsoleKey.Q)
                {
                    break;
                }

                if (char.IsNumber(consoleKeyInfo.KeyChar))
                {
                    var product = Products[(int)char.GetNumericValue(consoleKeyInfo.KeyChar)];
                    products.Add(product);
                    Console.WriteLine($"Added {product.name}");
                }

                if (consoleKeyInfo.Key == ConsoleKey.Enter)
                {
                    await eventsEngine.Publish<IDummyRequest>(new
                    {
                        requestedData = products.Select(x => new { Name = x.name, Price = x.price }).ToList()
                    });

                    Console.WriteLine("Submitted Order");

                    products.Clear();
                }
            }
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }

        private static readonly IReadOnlyList<(string name, decimal price)> Products = new List<(string, decimal)>
        {
            ("Bread", 1.20m),
            ("Milk", 0.50m),
            ("Rice", 1m),
            ("Buttons", 0.9m),
            ("Pasta", 0.9m),
            ("Cereals", 1.6m),
            ("Chocolate", 2m),
            ("Noodles", 1m),
            ("Pie", 1m),
            ("Sandwich", 1m),
        };
    }
}

Это будет срабатывать, работать и продолжать работать. Крутой вещью здесь также является цикл for (;;), это хитрый трюк, позволяющий запускать его в цикле, чтобы вы могли заново делать вещи снова и снова, хостинг просто означает, что вам не нужно беспокоиться о поддерживая консоль.

У меня даже есть клавиша Escape, как вы хотите:

if (consoleKeyInfo.Key == ConsoleKey.Q)
            {
                break;
            }

Более подробный пример использования размещенной установки можно найти по этой ссылке https://jmezach.github.io/2017/10/29/having-fun-with-the-.net-core-generic-host/

Проходит через все это, поэтому должно помочь.

0 голосов
/ 01 ноября 2018

Давайте упростим задачу: извлечем метод :

   private static void MyRoutine() {
     Console.Write("Enter your selection (1, 2, or 3): "); 

     String input = Console.ReadLine();
     int n = 0;

     // User Input validation: we want integer value (int.TryParse) in the desired rang
     if (!int.TryParse(input, out n)) {
       Console.WriteLine("Sorry, invalid selection. Integer value expected");  

       return;
     }
     else if (n < 1 || n > 3) {
       Console.WriteLine("Sorry, invalid selection. Range of 1..3 expected.");

       return;         
     } 

     // n is valid
     switch (n) {
       case 1:
         Console.WriteLine("Current value is {0}", 1);
         break;
       case 2:
         Console.WriteLine("Current value is {0}", 2);
         break;
       case 3:
         Console.WriteLine("Current value is {0}", 3);
         break;
     }
   }

Теперь мы готовы продолжить выполнение подпрограммы ( repeat обычно представляет собой loop ; здесь мы имеем do..while):

   static void Main() {
     do {
       MyRoutine();

       Console.WriteLine("Would you like to repeat? Y/N");
     }
     while (char.ToUpper(Console.ReadKey().KeyChar) == 'y');

     Console.WriteLine("Press any key to exit.");
     Console.ReadKey();
   }  
0 голосов
/ 01 ноября 2018

Вы можете сделать что-то вроде:

class Switch
    {
    static void Main()
    {
    bool repeat = false;
    do {
        repeat = false;
        Console.Write("Enter your selection (1, 2, or 3): ");
        string s = Console.ReadLine();
        int n = Int32.Parse(s);

        switch (n)
        {
            case 1:
                Console.WriteLine("Current value is {0}", 1);
                break;
            case 2:
                Console.WriteLine("Current value is {0}", 2);
                break;
            case 3:
                Console.WriteLine("Current value is {0}", 3);
                break;
            default:
                Console.WriteLine("Sorry, invalid selection.");
                break;
        }
        Console.WriteLine("Would you like to repeat? Y/N");
        input = Console.ReadKey().KeyChar;
        repeat = (input == 'Y');

    }while(repeat);
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
    }

добавление цикла do while с проверкой в ​​конце, если пользователь хочет повторить.

...