Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 30.07.2016
Сообщений: 122

Можно ли воссоздать switch case другими методами?

10.11.2016, 01:22. Показов 1506. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Можно ли симулировать точную работу switch case другими методами, например, используя if и while?

Добавлено через 1 минуту
Наверно не будет с if работать break, чтобы завершать поиск при нахождении нужного условия, а не проходить весь цикл целиком. Но всё же интересует эта возможность.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2016, 01:22
Ответы с готовыми решениями:

Карта регионов (какими методами можно воссоздать?)
Доброго времени суток, есть задача, создать карту России с регионами, при наведении на регион - область должна подсвечиваться, при нажатии...

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

Можно ли заново пройти одит и case в switch?
Есть switch в котором идут case, и в одном case я хочу сделать так, если в нем не выполняется if тогда заново отправить на исполнение того...

22
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
10.11.2016, 01:43
Лучший ответ Сообщение было отмечено Native16 как решение

Решение

1. Любой цикл c одной итерацией и куча условий внутри. При совпадении условия - break.
2. Отдельно в метод выделить и return при выполнении условия.
1
0 / 0 / 1
Регистрация: 30.07.2016
Сообщений: 122
10.11.2016, 01:49  [ТС]
IamRain, спасибо. Я так и думал
0
.NET C#,ASP.NET MVC
Эксперт .NET
 Аватар для lvlkoo
594 / 507 / 224
Регистрация: 16.10.2010
Сообщений: 1,902
10.11.2016, 02:18
Для того чтоб не плодить у себя кучу кейсов, я у себя использую словарь с ключем - перечесление и значением делегатом

Что-то вроде этого

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private Dictionary<SomeEnum, Action<SomeAurgumentType>> _actionMap = new Dictionary<SomeEnum, Action<SomeAurgumentType>>
{
    {SomeEnum.Value1, SomeFunction1}, 
    {SomeEnum.Value2, SomeFunction2}
}
 
....
 
private void DoWork(SomeEnum enumValue)
{
    var action = _actionMap[enumValue];
    action(...);
}
 
private void SomeFunction1(SomeAurgumentType arg)
{
    //do work
}
1
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
10.11.2016, 12:48
Цитата Сообщение от Native16 Посмотреть сообщение
например, используя if
C#
1
2
3
4
5
6
if(x == 0)
{}
else if(x == 1)
{}
else if (x == 2)
{}
Если у Вас какая-то переменная сравнивается с другой переменной (не константой!) то на C# это, скорее всего, единственное решение
0
Эксперт .NET
 Аватар для Usaga
14298 / 9383 / 1353
Регистрация: 21.01.2016
Сообщений: 35,374
10.11.2016, 13:07
Цитата Сообщение от Native16 Посмотреть сообщение
Можно ли симулировать точную работу switch case другими методами
Можно узнать, для чего?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
10.11.2016, 13:20
Serg34, декомпиляторы .Net примерно так и показывают switch-case конструкции.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
10.11.2016, 13:30
Стоит отметить, что использование switch и подобных конструкций может сильно снизить качество кода.
Поэтому эти конструкции нужно использовать с умом
Посмотрите это видео
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
10.11.2016, 14:12
Цитата Сообщение от Serg34 Посмотреть сообщение
использование switch
А вот некоторые авторы книг с вами не согласны. Пишут, что switch...case наоборот, позволяет писать более чистый код.
0
Эксперт .NET
 Аватар для Usaga
14298 / 9383 / 1353
Регистрация: 21.01.2016
Сообщений: 35,374
10.11.2016, 14:16
Цитата Сообщение от Serg34 Посмотреть сообщение
использование switch и подобных конструкций может сильно снизить качество кода.
Цитата Сообщение от insite2012 Посмотреть сообщение
что switch...case наоборот, позволяет писать более чистый код.
А правда как всегда посередине
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
10.11.2016, 14:25
Цитата Сообщение от Usaga Посмотреть сообщение
правда как всегда посередине
Именно так))
Я предпочитаю простой подход:
два варианта - if{}else{}
от двух до пяти - switch..case..
больше пяти - словарь.
1
Эксперт .NET
 Аватар для Usaga
14298 / 9383 / 1353
Регистрация: 21.01.2016
Сообщений: 35,374
10.11.2016, 14:30
Цитата Сообщение от insite2012 Посмотреть сообщение
больше пяти - словарь.
Мне кажется, что планку можно было бы и поднять, ибо процессору может быть быстрее и проще пробежаться по списку IF-ов, чем считать хеш, а потом ещё лукать в бакете или лазить по красно-чёрному дереву.

Добавлено через 1 минуту
Хотя это вопрос спорный и дискуссионный.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
10.11.2016, 14:42
insite2012, Usaga,
Цитата Сообщение от Serg34 Посмотреть сообщение
Поэтому эти конструкции нужно использовать с умом

Давайте на реальных примерах разберем, самому интересно стало
Хорошо:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
private void dgvMain_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            switch(e.ColumnIndex)
            {
                case 0: e.Value = personsView[e.RowIndex].Name; break;
                case 1: e.Value = personsView[e.RowIndex].Birthday.ToShortDateString(); break;
                case 2: e.Value = personsView[e.RowIndex].Age; 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
public class BadClass
{
    public string Name { get; set; }
}
 
public class Worker
{
    public void PrintName(BadClass bad)
    {
        switch (bad.Name)
        {
            case "First" : Console.WriteLine(GetName1(bad)); break;
            case "Second" : Console.WriteLine(GetName2(bad)); break;
        }
    }
    public void PrintFullName(BadClass bad)
    {
        switch (bad.Name)
        {
            case "First" : Console.WriteLine(GetFullName1(bad)); break;
            case "Second" : Console.WriteLine(GetFullName2(bad)); break;
        }
    }
    
    private string GetName1(BadClass bad)
    {
        return $"{bad.Name}1";
    }
    private string GetName2(BadClass bad)
    {
        return $"{bad.Name}2";
    }
    
    private string GetFullName1(BadClass bad)
    {
        return $"BadClass {bad.Name}1";
    }
    private string GetFullName2(BadClass bad)
    {
        return $"BadClass {bad.Name}2";
    }
}


То есть если у нас тривиальная логика с множеством разветвлений, то switch - это хорошо. Но если у нас switch определяет поведение объекта, причем в разных местах один и тот же (подобный) switch используется - это плохо. Лучше внести методы GetName и GetFullName внутрь класса BadClass.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
10.11.2016, 14:45
Serg34, во втором примере применение switch-case - наименьшее из проблем.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
10.11.2016, 14:48
Цитата Сообщение от Serg34 Посмотреть сообщение
на реальных примерах
Serg34, я предпочитаю использовать эту конструкцию с простыми типами (как правило, удобнее всего перечисления). А для анализа-разбора классов уже что-то другое.
Цитата Сообщение от Usaga Посмотреть сообщение
Хотя это вопрос спорный и дискуссионный.
Кто как привык, наверное.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
10.11.2016, 15:21
Цитата Сообщение от aquaMakc Посмотреть сообщение
во втором примере применение switch-case - наименьшее из проблем.
Я бы так не сказал.
Если у Вас завтра добавится/ поменяется еще одно условие, то Вам по всему коду нужно будет искать все switch, кроме того с точки зрения ООП выбор метода - ответственность именно класса BadClass.
Лучше и понятнее так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public abstract class GoodClass
{
    public string Name { get; set; }
    
    public abstract string GetName();
    public abstract string GetFullName();
}
public class GoodClass1
{
    public string Name { get; set; }
    
    public override string GetName()
    {
        return $"{Name}1";
    }
    public override string GetFullName()
    {
        return $"GoodClass {Name}1";
    }
}
Если логика сложнее, то можно паттерн "Состояние" применить (вроде, на него больше похоже)
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
45
46
47
48
49
50
51
52
53
54
55
public class GoodClass
{
    private State state;
    
    public GoodClass(State state)
    {
        this.state = state;
    }
    
    public string Name { get; set; }
    
    public string GetName()
    {
        return state.GetName;
    }
    public string GetFullName()
    {
        return state.GetFullName;
    }
}
public abstract class State
{
    public abstract string GetName(GoodClass bad);
    public abstract string GetFullName(GoodClass bad);
}
 
public class State1 : State
{
    private override string GetName(GoodClass bad)
    {
        return $"{bad.Name}1";
    }
    private override string GetFullName(GoodClass bad)
    {
        return $"GoodClass {bad.Name}1";
    }
}
 
public class Worker
{
    public string PrintName(GoodClass bad)
    {
        var state = new State1();
        var goodClass = new GoodClass(state);
        
        return goodClass.GetName();
    }
    public string PrintFullName(GoodClass bad)
    {
        var state = new State1();
        var goodClass = new GoodClass(state);
        
        return goodClass.GetFullName();
    }
}
Добавлено через 2 минуты
Цитата Сообщение от insite2012 Посмотреть сообщение
больше пяти - словарь.
Про словари - интересная идея. Попробую, спасибо
0
0 / 0 / 1
Регистрация: 30.07.2016
Сообщений: 122
10.11.2016, 16:29  [ТС]
Нифига вы тут!
Цитата Сообщение от Usaga Посмотреть сообщение
Сообщение от Native16
Можно ли симулировать точную работу switch case другими методами
Можно узнать, для чего?
Чтобы Вы поняли, то, пожалуйста, ответьте на вопрос: В чём разница между ста целочисленными переменными и массивом размерностью 100? Если Вы скажете, что ни в чём, то я попрошу Вас посмотреть на это с точки зрения затрат сил. А, если Вы ответите, что в удобстве, то я попрошу Вас посмотреть на обратную сторону этого ответа. Там и будет крыться мой ответ на Ваш вопрос
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
10.11.2016, 16:41
Цитата Сообщение от Native16 Посмотреть сообщение
с точки зрения затрат сил
затрат сил на что?
Цитата Сообщение от Native16 Посмотреть сообщение
посмотреть на обратную сторону этого ответа
какого ответа?

Недосказанность - это как
0
0 / 0 / 1
Регистрация: 30.07.2016
Сообщений: 122
10.11.2016, 16:50  [ТС]
aquaMakc, короче. Это понимание того, что происходит. А массив - это удобство для пользователя.

Добавлено через 1 минуту
Тоже самое в чём разница между а = а + 1 и а++. Первый вариант для новичков, чтобы видеть структуру, а второй для удобства пользования.
0
Эксперт .NET
 Аватар для Usaga
14298 / 9383 / 1353
Регистрация: 21.01.2016
Сообщений: 35,374
10.11.2016, 16:50
Native16, белеберда какая-то
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2016, 16:50
Помогаю со студенческими работами здесь

Можно как-то сократить код с switch case?
Можно как-то сократить следующий код с switch case? switch (labelFileSaved.Text) { case...

Как в as3 можно избавиться от оператора switch-case?
Добрый день! Использую в программе фабрику создания экземпляров животных public class AnimalFactory { public function...

Можно ли в операторе switch в case записать не конкретное значение, а диапазон?
Можно ли в операторе switch в case записать не конкретное значение, а диапазон? Например: switch(a){ case диапазон1: действие; break; ...

Оптимальная конструкция switch-case-while / while-switch-case
Имеется конструкция типа: switch() { case 1: while() { ... }

Можно ли как-то заставить сработать одновременно все case у оператора switch?
Вопрос в заголовке темы:)


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru