Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
 Аватар для Anvean
63 / 55 / 10
Регистрация: 12.02.2019
Сообщений: 303

Избавится от switch case

17.12.2019, 18:53. Показов 5673. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всё задание в заголовке, видел способ как можно заменить свитч с помощью словаря и делегат, хочу узнать может есть еще какие-то способы?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.12.2019, 18:53
Ответы с готовыми решениями:

Как избавится от switch case?
Как избавится от большого swich case допустим вот такой, хотя у меня он намного больше. Может можно с помощью списков? ...

Можно ли избавится от switch?
есть вот такая конструкция можно как то ее заменить ? - на Linq допустим switch (wtf.ToLower()) { ...

SWITCH-CASE

20
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
17.12.2019, 19:19
if/else if/else
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
17.12.2019, 19:22
Паттерн Стратегия

Добавлено через 40 секунд
Про if/else https://habr.com/ru/company/microsoft/blog/423229/
0
 Аватар для Anvean
63 / 55 / 10
Регистрация: 12.02.2019
Сообщений: 303
17.12.2019, 19:22  [ТС]
Элд Хасп, Что-то более заумное нужно, заменять одну условную конструкцию другой это конечно хорошо, но думаю не то что от меня ожидают :/
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
17.12.2019, 19:23
Anvean, а зачем вам это?
0
 Аватар для Anvean
63 / 55 / 10
Регистрация: 12.02.2019
Сообщений: 303
17.12.2019, 19:26  [ТС]
Элд Хасп, Получил такое задание, избавится в коде от switch case усложнить по максимуму, по идее словари и списки еще не проходили, остановились на делегатах.
0
 Аватар для Enifan
1846 / 1188 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
17.12.2019, 19:27
Anvean, а можно хотя бы часть кода? может какие идеи да появятся. Или хотя бы знать, что перебирать будем
0
 Аватар для Anvean
63 / 55 / 10
Регистрация: 12.02.2019
Сообщений: 303
17.12.2019, 19:30  [ТС]
Enifan, https://github.com/Anvean21/Cs... arrator.cs Надеюсь тут можно ссылки на репы кидать:)
0
68 / 38 / 11
Регистрация: 07.11.2019
Сообщений: 136
17.12.2019, 19:54
Пусть есть код

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void Foo(string pattern)
{
    switch (pattern)
    {
        case "X":
            DoX();
            break;
        case "Y":
            DoY();
            break;
        default:
            DoZ();
            break;
    }
}

Нам он почему-то не нравится. Попробуем перевести его в стратегию, и чтобы было более приближенно к реальности, добавим фабрику.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public interface IDo
{
    void Do();
}
 
class XDo : IDo
{
    public void Do() { }
}
 
class YDo : IDo
{
    public void Do() {}
}
 
 
class ZDo : IDo
{
    public void Do() {}
}
 
interface IDoFactory
{
    IDo Create(string pattern);
}
 
class DoFactory : IDoFactory
{
    private static IDo DefaultDo = new ZDo();
 
    private static readonly Dictionary<string, IDo> dictionary = new Dictionary<string, IDo>
    {
        { "x", new XDo() },
        { "y", new YDo() }
    };
 
    public IDo Create(string pattern)
    {
        return dictionary.ContainsKey(pattern)
            ? dictionary[pattern]
            : DefaultDo;
    }
}
И где-то определим пример
C#
1
2
3
IDoFactory factory = new DoFactory();
IDo doobj = factory.Create("x");
doobj.Do();
Теперь зададим себе вопрос - что поменялось? Всесто простой конструкции switch добавилось куча классов, которые еще предстоит поддерживать. При этом "x", "y" и "z" так же декларативно заданы, только внутри фабрики. Кажется не рационально.

Можно ли их задать динамически, подгрузив в рантайме из некоторого источника данных. Ответ можно. Но тогда и значения словаря придется создавать на уровне рефлексии, и то в случае если паттерн будет соответствовать некоторой конвенции по названиям классов в программе. Поддерживать такой код тоже достаточно неприятно.

Конечно есть случаи, когда такой подход имеет плюсы. Но если говорить обобщенно, то следует хорошо подумать и взвесить, а нужно ли такое делать.
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.12.2019, 20:34
Цитата Сообщение от Anvean Посмотреть сообщение
усложнить по максимуму
ваш код и так сложно читать
0
 Аватар для Enifan
1846 / 1188 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
17.12.2019, 20:46
Цитата Сообщение от КОП Посмотреть сообщение
ваш код и так сложно читать
тоже думал над этим. Ради интереса, как бы вы написать тот код? Через какие конструкции?
0
 Аватар для Anvean
63 / 55 / 10
Регистрация: 12.02.2019
Сообщений: 303
17.12.2019, 21:06  [ТС]
КОП, я уже слушал критику, все полотно с класса Narrator будет разбито на методы и тд, поэтому и спросил как избавится от свича и соответственно от тысячи вложений
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.12.2019, 21:08
Цитата Сообщение от Enifan Посмотреть сообщение
Ради интереса, как бы вы написать тот код? Через какие конструкции?
да то же дерево например, ветвление можно туда же впихнуть, readkey через строчку выносится в метод с циклом. Данные хотя бы сделать вид что находятся отдельно от кода.

Добавлено через 1 минуту
Anvean, а, ну вот как раз ответил
Цитата Сообщение от Anvean Посмотреть сообщение
избавится от свичи
Цитата Сообщение от Anvean Посмотреть сообщение
усложнить по максимуму
избавиться от свича тут упрощение, так что вы противоположное просите
0
 Аватар для Anvean
63 / 55 / 10
Регистрация: 12.02.2019
Сообщений: 303
17.12.2019, 21:16  [ТС]
КОП, Возможно не правильно выразился, нужно увеличить уровень кода, соответственно избавится от элементарных конструкций которые в избытке и использовать более профессиональные инструменты

Добавлено через 4 минуты
КОП, Немного не понятно почему данные должны быть отдельно от кода, а о деревьях пока не знаю, надо бы разобраться:)
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
17.12.2019, 21:33
Anvean, хороший код прост и понятен.

Почему данные отдельно от кода? Ну вот решили вы нанять сценариста для истории. Он же не будет райтлайны писать. Ему текстовый файл и он там строк наваляет. Вот и разделение уже есть. Кроме того как только сделаете, поймёте что это гораздо быстрее и проще написать чем вашу стену текста. Просто нужно 1 раз разобраться.

Если не знаете о деревьях, то хотя бы просто в методы внести все случаи в свичах и уже норм
0
 Аватар для Anvean
63 / 55 / 10
Регистрация: 12.02.2019
Сообщений: 303
17.12.2019, 21:43  [ТС]
КОП, Спасибо вам большое за фидбэк
0
2 / 2 / 0
Регистрация: 07.03.2014
Сообщений: 47
28.08.2020, 08:39
Вот сколько читаю объяснения как избавится от switch нигде не нахожу ответа. Вот поменяли мы код в данном месте на шаблон Стратегия или ещё как либо избавились. Но в конечном итоге исходный клас для этого полиморфизма все равно придется создавать по switch, Если знаете как решить эту проблему буду благодарен за пояснения

Добавлено через 4 минуты
Я к тому что может есть другие паттерны для красивой связки вместо switch или dictionary
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16123 / 11247 / 2888
Регистрация: 21.04.2018
Сообщений: 33,073
Записей в блоге: 2
28.08.2020, 08:43
Herasima, зависит от реальной задачи.
В данном конкретном случае ставилась задача:
Цитата Сообщение от Anvean Посмотреть сообщение
Получил такое задание, избавится в коде от switch case усложнить по максимуму
Лучше создайте свою тему с вопросом по своей задаче.
0
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
28.08.2020, 10:13
Цитата Сообщение от Anvean Посмотреть сообщение
как избавится от свича
if/else.
Цитата Сообщение от Anvean Посмотреть сообщение
и соответственно от тысячи вложений
Разбить код на методы.
0
Жесток & Наивен
 Аватар для sanec38
483 / 188 / 91
Регистрация: 02.02.2017
Сообщений: 427
28.08.2020, 10:15
Возможно эта задача из серии "на развития логике", так сказать до чего доведут игры разума испытуемого субъекта.
Про максимально усложнить, значит скорее всего что о правильности архитектурного подхода речи не идет.
Самое простое что лично мне пришло в голову это массив и перечисление.
Код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        public enum MethodNames
        {
            X, Y, Z
        }
        static Action[] _actions = new Action[3] { DoX,DoY,DoZ };
 
        private static void DoZ()
        {
            Console.WriteLine("Z");
        }
 
        private static void DoY()
        {
            Console.WriteLine("Y");
        }
 
        private static void DoX()
        {
            Console.WriteLine("X");
        }
 
        public static void Foo(MethodNames methodNames)
        {
            _actions[(int)methodNames]();
        }
        private static void Main(string[] args)
        {
            foreach(MethodNames item in Enum.GetValues(typeof(MethodNames)))
            {
                Foo(item);
            }
            Console.ReadLine();
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.08.2020, 10:15
Помогаю со студенческими работами здесь

switch - case 1 to 5
в вб используя select case можно указать для ветви Case 1 to 5 - тогда программа зайдет в эту веть, если наше значени 1..5 Как это...

Switch case 'Ш'
Всем доброго дня! Как сделать case для русского введённого с клавиатуры символа?

Switch - case и файл
Есть файл со структурой: name= /// тут пути к файлам

Switch case в C# как?
В зависимости от того какой TagInstance указан при вызове, нажимается соответствующая кнопка на форме На VB.NET все прекрасно работает ...

Switch Case на байтах
byte str; foreach (byte b in str) { switch (b) { case &quot;???&quot;: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru