Rozgałęzianie funkcji switch case

Rozgałęzianie funkcji switch case
Bjorn Nożycoręki
  • Rejestracja:około 4 lata
  • Ostatnio:około miesiąc
  • Lokalizacja:Rzeszów
  • Postów:13
0

Siemka!

Chcę utworzyć własny mały projekcik konsolowy w C# i chcę wykorzystać funkcję switch/case, ale w dość nietypowy sposób.. Otóż chcę aby wybierano case 1, otwierało kolejne case do wyboru, które były by właśnie w tym wybranym case 1, czy jest opcja wykonania czegoś takiego? Grzebać w środku switcha, czy poza?

W skrócie : Odpalam program, wyskakuje mi 5 opcji do wybrania, klikam pierwszą i wyskakuje mi np. kolejne 3 opcje do wybrania..

edytowany 1x, ostatnio: Bjorn Nożycoręki
YO
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 3 lata
  • Postów:540
0

Zagnieżdżony Switch

Kopiuj
switch(zmienna)
    {
        case 1:
            switch(zmienna2)
            {
                case 1:
                    break;
            }
        break;
    }
}

Dziura w ścianie gdzie Panowie widzą Panie,
Rick and Morty, season 1.
Szukam tej dziury, jak coś dajcie znać gdzie jest :D "A z Ciebie c**** pisowski" - Ula Papuszko (w sensie, że JA) 05.06.2020 r., grupa: Strajk Przedsiębiorców. Witam zatem, jestem c**** pisowski ;)
koszalek-opalek
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
0

Jeśli można, to pytanie na marginesie -- czy w C# nie ma elegantszych i czytelniejszych (niż case) metod rozgałęziania sterowania -- w stylu map/słowników/tablic asocjacyjnych, w których wartościami są funkcje/funktory?

Zobacz pozostały 1 komentarz
C1
Tak na marginesie dodam, że gdy switch ma więcej niż 6 casów zostaje zamieniony w takie właśnie dictionary przez kompilator :)
koszalek-opalek
@cebilon123: Ale w kodzie brzydota pozostanie. :)
C1
No tak! Ja tu tylko rzuciłem taką anegdotkę. Ja sam wolę tworzyć dictionary zamiast switch, choć w nowym C# wygląda to już fajnie :) (ten nowy switch)
somekind
Słowniki są od 21 lat, generyczne od 16, wówczas można było wstawiać tylko delegaty, a lambdy od 13 lat. Ale switch pewnie nadal jest w jednym z pierwszych rozdziałów każdego kursu/książki o programowaniu.
JU
  • Rejestracja:około 22 lata
  • Ostatnio:2 miesiące
  • Postów:5042
6

Oczywiście, że są słowniki (Dictionary<>). Zagnieżdżony switch to pierwszy krok do katastrofy. Przecież można ładniej:

Kopiuj
switch(selection)
{
    case 1: 
        ShowOption1();
        break;

    case 1: 
        ShowOption2();
        break;
}

Itd. Porozwalaj to na metody albo na nawet na klasy.

Aventus
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:UK
  • Postów:2235
3

Nie wiem czy to satysfakcjonująca odpowiedź (zapewne chociaż częściowa). W C# jest już pattern matching więc można robić "mądrzejsze switche".

Kopiuj
option switch
{
  OptionA a when a.Value > 10 => FurtherSwitch(a),
  OptionA a when a.Value < 5 => FurtherSwitchWithLess(a),
  OptionA a => FurtherSwitchDefault(a),
  OptionB b => FurtherSwtich(b),
  OptionC c => FurtherSwitch(c),
  _ => HandleDefault()
}

SomeResult FurtherSwtich(OptionA a)
  => a switch
  {
    a.Something > ...,
    ...
  }

// itd...

Dodatkowo można użyć value tuples do jeszcze bardziej rozbudowanych porównań:

Kopiuj
(optionOne.SomeValue, optionTwo.SomeValue) switch
{
  (1, 10) => Something(),
  (11, 20) => SomethingElse(),
  ...
}

Na każdy złożony problem istnieje rozwiązanie które jest proste, szybkie i błędne.
edytowany 1x, ostatnio: Aventus
G1
Ale zawaliste :O

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.