Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
generation472
19 / 19 / 2
Регистрация: 04.11.2011
Сообщений: 558
Записей в блоге: 1
#1

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

02.10.2014, 16:48. Просмотров 1081. Ответов 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 ? - C#
Собственно когда-то читал, что некоторые компиляторы для си превращали switch-case в over9000 if-else, что приводило к медленному...

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

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

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

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

Сильно раздутый switch case - C#
Ломаю голову над одной простой задачей. Как красивее и производительнее закодировать тип данных. Есть БД на sql server. В ней несколько...

11
Num2
11 / 11 / 1
Регистрация: 09.07.2012
Сообщений: 70
02.10.2014, 16:52 #2
если тебе важно значение "case 130", типа по этому "130" обращаться, можешь залупашить Dictionary
1
generation472
19 / 19 / 2
Регистрация: 04.11.2011
Сообщений: 558
Записей в блоге: 1
02.10.2014, 16:58  [ТС] #3
Num2, можно пример, ну да типо по значению 130 я узнаю что это 500_KHz, и чтоб все значения "Герцов" я мог передать в combobox.datasource это возможно?
0
Ev_Hyper
Заблокирован
02.10.2014, 17:08 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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 / 1
Регистрация: 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 / 2
Регистрация: 04.11.2011
Сообщений: 558
Записей в блоге: 1
02.10.2014, 17:26  [ТС] #6
Ev_Hyper, да точно нужно шикарно, только мне нужны keys спс
0
Num2
11 / 11 / 1
Регистрация: 09.07.2012
Сообщений: 70
02.10.2014, 17:31 #7
C#
1
comboBox1.DataSource = d.Keys.ToList();
1
5665tm
170 / 116 / 6
Регистрация: 17.06.2013
Сообщений: 383
Завершенные тесты: 2
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 / 2
Регистрация: 04.11.2011
Сообщений: 558
Записей в блоге: 1
03.10.2014, 09:46  [ТС] #9
5665tm, а на быстродействие это влияет? у меня довольно большой список.


а можно зная значение получить ключ и присвоить его(ключ) другой переменной?
0
5665tm
170 / 116 / 6
Регистрация: 17.06.2013
Сообщений: 383
Завершенные тесты: 2
03.10.2014, 10:19 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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 / 2
Регистрация: 04.11.2011
Сообщений: 558
Записей в блоге: 1
03.10.2014, 10:45  [ТС] #11
5665tm, я использую решарп и он мне посоветовал перевести в Linq
0
Learx
1039 / 846 / 86
Регистрация: 31.03.2010
Сообщений: 2,466
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, ошибка в преобразовании выражений - C#
Товарищи-коллеги, волею судеб я очень-очень начинающий программист C# и прошу помощи. Задача: расчёт Y по разным формулам в зависимости...

Рефакторинг длинных контрукций switch \ case - C#
Здравствуйте, возник вопрос: Если в приложении испольузется очень длинная контркуция switch \ case Например: switch...

.NET 2.x Несколько цифр для case в switch'e - C#
Решил объеденить два условия для case и сделать так: case 1, 3:{ } case2: ... Но меня очень удивило, что компилятор...

Ошибка при применении перечислений в Switch Case - C#
Кусок програмы private List&lt;Webcast&gt; GetByType(string id) { var result = new List&lt;Webcast&gt;(); switch (id) { case...


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

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

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