Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 563
Записей в блоге: 1
#1

Как избавится от switch case? - C#

02.10.2014, 16:48. Просмотров 1189. Ответов 11
Метки нет (Все метки)

Как избавится от большого swich case
допустим вот такой, хотя у меня он намного больше.
Может можно с помощью списков?
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
  switch (ScKspeed)
            {
                case 128:
                    ConfigString[0] = "8_MHz";
                    break;
                case 0:
                    ConfigString[0] = "4_MHz";
                    break;
                case 129:
                    ConfigString[0] = "2_MHz";
                    break;
                case 1:
                    ConfigString[0] = "1_MHz";
                    break;
                case 130:
                    ConfigString[0] = "500_KHz";
                    break;
                case 3:
                    ConfigString[0] = "125_KHz";
                    break;
                default:
                    ConfigString[0] = "1_MHz";
                    break;
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2014, 16:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как избавится от switch case? (C#):

Как работает switch-case ?
Собственно когда-то читал, что некоторые компиляторы для си превращали...

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

Как записать в операторе switch case последовательность
Допустим с 1 до 10 выводится определенное значение, с 11 до 20 другое значение....

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

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

Оператор switch-case
Привет, друзья!) Такой вопрос: Можно ли создавать в глобальном switch-case...

11
Num2
11 / 11 / 4
Регистрация: 09.07.2012
Сообщений: 70
02.10.2014, 16:52 #2
если тебе важно значение "case 130", типа по этому "130" обращаться, можешь залупашить Dictionary
1
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 563
Записей в блоге: 1
02.10.2014, 16:58  [ТС] #3
Num2, можно пример, ну да типо по значению 130 я узнаю что это 500_KHz, и чтоб все значения "Герцов" я мог передать в combobox.datasource это возможно?
0
Ev_Hyper
Заблокирован
02.10.2014, 17:08 #4
Лучший ответ Сообщение было отмечено generation472 как решение

Решение

Цитата Сообщение от generation472 Посмотреть сообщение
Num2, можно пример, ну да типо по значению 130 я узнаю что это 500_KHz, и чтоб все значения "Герцов" я мог передать в combobox.datasource это возможно?
generation472, вы об этом?
C#
1
2
3
4
5
6
7
8
9
          
  Dictionary<string, string> d = new Dictionary<string, string>();
            d.Add("0", "4_MHz");
            d.Add("1", "1_MHz");
            d.Add("3", "125_KHz");
            d.Add("128", "8_MHz");
            d.Add("129", "2_MHz");
            d.Add("130", "500_KHz");
            comboBox1.DataSource = d.Values.ToList();
1
Num2
11 / 11 / 4
Регистрация: 09.07.2012
Сообщений: 70
02.10.2014, 17:18 #5
ну загонять в Dictionary вот так

C#
1
2
Dictionary<int, string> DictionaryName = new Dictionary<int, string>();
DictionaryName.Add(130, "500_KHz");
потом ты говоришь, достать значение по ключу (значение твои Гц, ключ - 130)

C#
1
string s = DictionaryName[130]
1
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 563
Записей в блоге: 1
02.10.2014, 17:26  [ТС] #6
Ev_Hyper, да точно нужно шикарно, только мне нужны keys спс
0
Num2
11 / 11 / 4
Регистрация: 09.07.2012
Сообщений: 70
02.10.2014, 17:31 #7
C#
1
comboBox1.DataSource = d.Keys.ToList();
1
5665tm
170 / 116 / 14
Регистрация: 17.06.2013
Сообщений: 386
Завершенные тесты: 3
02.10.2014, 17:48 #8
В Dictionary можно загонять значения чуть более изящнее на стадии инициализации

C#
1
2
3
4
5
6
            var d = new Dictionary<string, string> {
                {"0", "4_MHz"},
                {"1", "1_MHz"},
                {"3", "125_KHz"},
                {"128", "8_MHz"}
            };
1
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 563
Записей в блоге: 1
03.10.2014, 09:46  [ТС] #9
5665tm, а на быстродействие это влияет? у меня довольно большой список.


а можно зная значение получить ключ и присвоить его(ключ) другой переменной?
0
5665tm
170 / 116 / 14
Регистрация: 17.06.2013
Сообщений: 386
Завершенные тесты: 3
03.10.2014, 10:19 #10
Лучший ответ Сообщение было отмечено generation472 как решение

Решение

generation472, если и влияет, то явно не в худшую сторону. Насколько я знаю это будет преобразованно в те же самые инструкции. В любом случае даже если у вас список из тысячи элементов, то добавится это все за доли секунды

Цитата Сообщение от generation472 Посмотреть сообщение
а можно зная значение получить ключ и присвоить его(ключ) другой переменной?
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
using System;
using System.Collections.Generic;
 
namespace ConsoleApplication3
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var dic = new Dictionary<int, string> {{1, "one"}, {2, "two"}, {3, "three"}};
            // значение ключ которого мы хотим найти
            const string FIND_VALUE = "one";
            // ключ
            // int? тип который может принимать значение null
            int? key = null;
            // ищем ключ в цикле
            // если нескольким ключам соответствуют одинаковые значения, будет выбран первый
            foreach (var d in dic.Keys)
            {
                if (dic[d] == FIND_VALUE)
                {
                    key = d;
                    break;
                }
            }
            // если ключ был найден
            if (key != null)
            {
                Console.WriteLine(Convert.ToString(key));
            }
                // если совпадения не было
            else
            {
                Console.WriteLine("key not found");
            }
            Console.ReadKey();
        }
    }
}
еще цикл можно написать через LINQ, но на мой взгляд так сложнее для понимания

C#
1
2
3
4
            foreach (var d in dic.Keys.Where(d => dic[d] == FIND_VALUE))
            {
                key = d;
            }
Добавлено через 12 минут
Прошу прощения, последний кусок кода немного неправилен, так эффективнее. Ну и как показал тест, c использованием Linq работает на 10% медленнее

C#
1
2
3
4
5
            foreach (var d in dic.Keys.Where(d => dic[d] == FIND_VALUE))
            {
                key = d;
                break;
            }
1
generation472
19 / 19 / 7
Регистрация: 04.11.2011
Сообщений: 563
Записей в блоге: 1
03.10.2014, 10:45  [ТС] #11
5665tm, я использую решарп и он мне посоветовал перевести в Linq
0
Learx
1045 / 852 / 194
Регистрация: 31.03.2010
Сообщений: 2,486
03.10.2014, 10:52 #12
5665tm, а попробуйте протестировать такой запрос Linq:
C#
1
2
var t= dic.FirstOrDefault(f=>f.Value==FIND_VALUE);
if(t!=null) k=t.Key;
я думаю, что он будет быстрее даже вашего foreach'а
1
03.10.2014, 10:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2014, 10:52
Привет! Вот еще темы с решениями:

Оператора switch / case
Локатор ориентирован на одну из сторон света ( «С» - север, «Ю» - юг, «З» -...

Не работает конструкция switch-case
Здравствуйте. Изучаю С# вторую неделю и не понимаю почему у меня не работает...

Сильно раздутый switch case
Ломаю голову над одной простой задачей. Как красивее и производительнее...

Несколько цифр для case в switch'e
Решил объеденить два условия для case и сделать так: case 1, 3:{ }...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru