Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
 Аватар для Kotyara0live
34 / 28 / 27
Регистрация: 23.02.2016
Сообщений: 367

Можно ли избавится от switch?

05.01.2018, 19:06. Показов 4847. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть вот такая конструкция можно как то ее заменить ? - на Linq допустим
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
switch (wtf.ToLower())
                {
                    case ("like"):case ("l"):
                        facebook[0].Procces();
                        facebook[0].Make();
                        break;
                    case ("sharer"):case ("s"):
                        facebook[1].Procces();
                        facebook[1].Make();
                        break;
                    case ("clear"):case ("c"):
                        facebook[0].Procces();
                        facebook[0].Make();
                        break;
                    case ("Checker"):case ("Ch"):
                        facebook[0].Procces();
                        facebook[0].Make();
                        break;
                    case ("end"): case ("exit"): case ("e"):
                        next = false;
                        break;
                }
Буду благодарен )
Побывал с enum но у меня большой и неуместный код
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2018, 19:06
Ответы с готовыми решениями:

Избавится от switch case
Всё задание в заголовке, видел способ как можно заменить свитч с помощью словаря и делегат, хочу узнать может есть еще какие-то способы?

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

Можно ли избавится от Maybe в типе?
есть пользовательский тип product , есть первая функция которая возвращает maybe produkt и вторая функция в вычислениях который...

16
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.01.2018, 19:07
Цитата Сообщение от Kotyara0live Посмотреть сообщение
можно как то ее заменить ?
Заменить-то можно, только вот по этому куску что-то сказать сложновато... Опишите проблему, можно подумать.
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,299
05.01.2018, 19:10
Kotyara0live, это - говнокод не столько из-за наличия switch-case (что не является зазорным), сколько из-за того, что у вас четыре раза код повторяется. Замените код в каждом сейсе на определение индекса, а после блока switch используйте этот индекс для обращения к массиву.

Если вариантов станет совсем много, то их можно "утрамбовать" в словарь в (Dictionary или SortedDictionary).
1
 Аватар для Kotyara0live
34 / 28 / 27
Регистрация: 23.02.2016
Сообщений: 367
05.01.2018, 19:15  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Опишите проблему, можно подумать.
есть массив
C#
1
Facebook[] facebook = { new Likes(), new Sharer() };
после ввода пользователя
C#
1
string wtf = Console.ReadLine();
свич выполняет свое дело .. но .. меня смущает это то что если я добавлю еще один элемент в массив то мне нужно пилить еще один кейс , а если 10 элементов оО ..

Добавлено через 2 минуты
Цитата Сообщение от Usaga Посмотреть сообщение
сколько из-за того, что у вас четыре раза код повторяется.
в коде для примера индексы не правильные , если я правильно понял вас
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.01.2018, 19:16
Цитата Сообщение от Kotyara0live Посмотреть сообщение
есть массив
Что такое Facebook и что такое Likes, Sharer? Я так предполагаю, что это базовый класс и его наследники, верно?
Если так, то почему бы в базовом классе не определить абстрактный метод, а в наследниках просто его переопределить и вызывать? На крайний случай, использовать паттерн Шаблонный метод. Это в разы удобнее (и правильнее).
0
 Аватар для Kotyara0live
34 / 28 / 27
Регистрация: 23.02.2016
Сообщений: 367
05.01.2018, 19:26  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Если так, то почему бы в базовом классе не определить абстрактный метод, а в наследниках просто его переопределить и вызывать? На крайний случай, использовать паттерн Шаблонный метод. Это в разы удобнее (и правильнее).
ну вот в классе Facebook у меня абстрактный метод Make() (так как у меня в всех дочерних классах реализация разная )
а вот с методом Procces все наоборот , я хочу как то избавиться от свича
если я правильно понял то в базовом классе создать метод void Patern() который будет вызывать 2 выше упомянутых метода ? или все же не так ?
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.01.2018, 19:29
Цитата Сообщение от Kotyara0live Посмотреть сообщение
у меня в всех дочерних классах реализация разная
Еу вот, вы его переопределили в наследниках и используете.
Цитата Сообщение от Kotyara0live Посмотреть сообщение
с методом Procces все наоборот
Что наоборот? Везде один и тот же код?
0
338 / 327 / 154
Регистрация: 29.10.2012
Сообщений: 949
05.01.2018, 19:30
А можно мне тут "костыль воткнуть", на основе поста Usaga:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dictionary<string, int> myDic = new Dictionary<string, int>();
myDic.Add("like", 0);
myDic.Add("l", 0);
myDic.Add("sharer", 1);
myDic.Add("s", 1);
myDic.Add("clear", 0);
myDic.Add("c", 0);
myDic.Add("end", 0);
myDic.Add("exit", 0);
myDic.Add("e", 0);
 
if (myDic.ContainsKey(wtf.ToLower()))
{
    int index = myDic[wtf.ToLower()];
    facebook[index].Procces();
    facebook[index].Make();
}
else
    next = false;
0
 Аватар для Kotyara0live
34 / 28 / 27
Регистрация: 23.02.2016
Сообщений: 367
05.01.2018, 19:32  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Что наоборот? Везде один и тот же код?
да , и он не помечен как абстрактный
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.01.2018, 19:33
Типа того что-то... Не видя кода сказать трудно.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication16 {
    class Program {
        static void Main(string[] args) {
            Facebook[] facebooks = { new Like(), new Share(), new Like() };
            facebooks.ToList().ForEach(f => f.Process());
            Console.ReadLine();
        }
    }
    class Like : Facebook {
        protected override void Make() {
            Console.WriteLine("Like.Make()");
        }
    }
    class Share : Facebook {
        protected override void Make() {
            Console.WriteLine("Share.Make()");
        }
    }
    abstract class Facebook {
        public void Process() {
            //Тут общий код...
            Make();
        }
        protected abstract void Make();
    }
}
Поправил под ваши имена методов.
0
 Аватар для Kotyara0live
34 / 28 / 27
Регистрация: 23.02.2016
Сообщений: 367
05.01.2018, 19:35  [ТС]
Цитата Сообщение от kmaffa Посмотреть сообщение
А можно мне тут "костыль воткнуть", на основе поста Usaga:
Спасибо за пример )
ну вот проблема такая же как и в свиче , если добавлю еще дочерние классы то мне нужно в myDic добавить элементы , или этого не избежать ?
__________________________
Индексе в моем коде не правильные (если что ))
0
Эксперт .NET
 Аватар для Usaga
14145 / 9374 / 1350
Регистрация: 21.01.2016
Сообщений: 35,299
05.01.2018, 19:39
Цитата Сообщение от kmaffa Посмотреть сообщение
А можно мне тут "костыль воткнуть"
Почему сразу "костыль"?) Это вполне себе вариант.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.01.2018, 19:40
Цитата Сообщение от Kotyara0live Посмотреть сообщение
проблема такая же как и в свиче
Используйте пример выше с шаблонным методом, и надобность в свитче/словаре отпадет.
0
 Аватар для Kotyara0live
34 / 28 / 27
Регистрация: 23.02.2016
Сообщений: 367
05.01.2018, 19:41  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Типа того что-то... Не видя кода сказать трудно.
код понял, так как и предполагал после фразы (шаблонный метод) только прошу уточнить , как мне допустим обратится к методу Process дочернего класса Like ( с Linq вообще еще не знаком )
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
05.01.2018, 19:44
Цитата Сообщение от Kotyara0live Посмотреть сообщение
код понял
Судя по вопросу, поняли не до конца. Показывайте код всех ваших классов, тогда можно будет сказать что-то точнее.
0
 Аватар для Kotyara0live
34 / 28 / 27
Регистрация: 23.02.2016
Сообщений: 367
05.01.2018, 19:54  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Показывайте код всех ваших классов, тогда можно будет сказать что-то точнее.
__________________
в дочерних класа только один метод Make, а в родителя Process и абстракт Make
пользователь вводит в данные, допустим ввел - Like ..
нужно вызвать (по коду который вы написали выше ) метод Process с override Make() для класса Like
просто я опять думаю о свиче
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
05.01.2018, 20:47
я как бьі так сделал....
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
44
    class Program
    {
        static void Main(string[] args)
        {
            var commands = new [] {
                new CommandTask(new[] { "like", "l", "clear", "c", "Checker", "Ch" }, () => {
                    facebook[0].Procces();
                    facebook[0].Make();
                }),
                new CommandTask(new[] { "sharer", "s" }, () => {
                    facebook[1].Procces();
                    facebook[1].Make();
                }),
                new CommandTask(new[] { "end", "exit", "e" }, () => {
                    next = false;
                })
            };
 
            //string wtf = "";
 
            commands.Any(c => c.CheckAndRun(wtf));
 
        }
    }
 
    public class CommandTask
    {
        private Action task;
        private string[] commands;
        public CommandTask(IEnumerable<string> commands, Action task)
        {
            this.commands = commands.Select(x => x.ToLower()).ToArray();
            this.task = task;
        }
        public bool CheckAndRun(string command)
        {
            if (commands?.Contains(command.ToLower()) == true)
            {
                task?.Invoke();
                return true;
            }
            return false;
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2018, 20:47
Помогаю со студенческими работами здесь

If и switch можно ли объединить?
Недавно начал изучать с++, так что не судите строга если код &quot;Говно код&quot; и я дурак))) #include &quot;stdafx.h&quot; #include...

Switch. Можно ли сравнивать строки?
switch (expression) { case label : statementlist ... default : statementlist } Вопрос: Могут ли...

Можно ли на jquery заменить if-else на switch
Вот есть такой код var notUser = &quot;Нет такого пользователя!&quot;; var notUserEn = &quot;A user is not found!&quot; function...

Чем можно заменить Switch -- case ?
Доброго времени суток, уважаемые форумчане! Помогите решить проблему с case. В этой программе нужно создать множественный выбор, который...

Можно ли свернуть блок Switch в коде
Как сделать так, чтобы оператор switch сворачивался так как void Instraction ?


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru