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

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

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

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

Добавлено через 1 минуту
Наверно не будет с if работать break, чтобы завершать поиск при нахождении нужного условия, а не проходить весь цикл целиком. Но всё же интересует эта возможность.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2016, 01:22
Ответы с готовыми решениями:

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

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

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

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

22
3654 / 2567 / 717
Регистрация: 02.08.2011
Сообщений: 6,926
10.11.2016, 01:43 2
Лучший ответ Сообщение было отмечено Native16 как решение

Решение

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

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

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
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
10.11.2016, 12:48 5
Цитата Сообщение от Native16 Посмотреть сообщение
например, используя if
C#
1
2
3
4
5
6
if(x == 0)
{}
else if(x == 1)
{}
else if (x == 2)
{}
Если у Вас какая-то переменная сравнивается с другой переменной (не константой!) то на C# это, скорее всего, единственное решение
0
Эксперт .NET
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
10.11.2016, 13:07 6
Цитата Сообщение от Native16 Посмотреть сообщение
Можно ли симулировать точную работу switch case другими методами
Можно узнать, для чего?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
10.11.2016, 13:20 7
Serg34, декомпиляторы .Net примерно так и показывают switch-case конструкции.
0
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
10.11.2016, 13:30 8
Стоит отметить, что использование switch и подобных конструкций может сильно снизить качество кода.
Поэтому эти конструкции нужно использовать с умом
Посмотрите это видео
1
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
10.11.2016, 14:12 9
Цитата Сообщение от Serg34 Посмотреть сообщение
использование switch
А вот некоторые авторы книг с вами не согласны. Пишут, что switch...case наоборот, позволяет писать более чистый код.
0
Эксперт .NET
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
10.11.2016, 14:16 10
Цитата Сообщение от Serg34 Посмотреть сообщение
использование switch и подобных конструкций может сильно снизить качество кода.
Цитата Сообщение от insite2012 Посмотреть сообщение
что switch...case наоборот, позволяет писать более чистый код.
А правда как всегда посередине
0
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
10.11.2016, 14:25 11
Цитата Сообщение от Usaga Посмотреть сообщение
правда как всегда посередине
Именно так))
Я предпочитаю простой подход:
два варианта - if{}else{}
от двух до пяти - switch..case..
больше пяти - словарь.
1
Эксперт .NET
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
10.11.2016, 14:30 12
Цитата Сообщение от insite2012 Посмотреть сообщение
больше пяти - словарь.
Мне кажется, что планку можно было бы и поднять, ибо процессору может быть быстрее и проще пробежаться по списку IF-ов, чем считать хеш, а потом ещё лукать в бакете или лазить по красно-чёрному дереву.

Добавлено через 1 минуту
Хотя это вопрос спорный и дискуссионный.
0
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
10.11.2016, 14:42 13
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 14
Serg34, во втором примере применение switch-case - наименьшее из проблем.
0
Эксперт .NET
5545 / 4308 / 1218
Регистрация: 12.10.2013
Сообщений: 12,356
Записей в блоге: 2
10.11.2016, 14:48 15
Цитата Сообщение от Serg34 Посмотреть сообщение
на реальных примерах
Serg34, я предпочитаю использовать эту конструкцию с простыми типами (как правило, удобнее всего перечисления). А для анализа-разбора классов уже что-то другое.
Цитата Сообщение от Usaga Посмотреть сообщение
Хотя это вопрос спорный и дискуссионный.
Кто как привык, наверное.
0
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
10.11.2016, 15:21 16
Цитата Сообщение от 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  [ТС] 17
Нифига вы тут!
Цитата Сообщение от Usaga Посмотреть сообщение
Сообщение от Native16
Можно ли симулировать точную работу switch case другими методами
Можно узнать, для чего?
Чтобы Вы поняли, то, пожалуйста, ответьте на вопрос: В чём разница между ста целочисленными переменными и массивом размерностью 100? Если Вы скажете, что ни в чём, то я попрошу Вас посмотреть на это с точки зрения затрат сил. А, если Вы ответите, что в удобстве, то я попрошу Вас посмотреть на обратную сторону этого ответа. Там и будет крыться мой ответ на Ваш вопрос
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
10.11.2016, 16:41 18
Цитата Сообщение от Native16 Посмотреть сообщение
с точки зрения затрат сил
затрат сил на что?
Цитата Сообщение от Native16 Посмотреть сообщение
посмотреть на обратную сторону этого ответа
какого ответа?

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

Добавлено через 1 минуту
Тоже самое в чём разница между а = а + 1 и а++. Первый вариант для новичков, чтобы видеть структуру, а второй для удобства пользования.
0
Эксперт .NET
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
10.11.2016, 16:50 20
Native16, белеберда какая-то
0
10.11.2016, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2016, 16:50
Помогаю со студенческими работами здесь

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

Можно ли в операторе switch в case записать не конкретное значение, а диапазон?
Можно ли в операторе switch в case записать не конкретное значение, а диапазон? Например:...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru