2015-04-21 3 views
-2

исчерпано noob здесь. У меня есть в основном 2 вопроса ...Корпус выключателя на целое с приоритетом

Извините за разъяснения, переключатели находятся внутри цикла, который получает кучу цифр, а затем сортирует их с помощью OrderByDescending(). Моя проблема теперь, я не знаю, какие числа есть, я знаю только, что они упорядочены по убыванию. Теперь у меня приоритет на числах, для меня более важно какое-то конкретное число, чем другое (за этим не существует правила или логики). Но, с другой стороны, ни один из чисел, которые я ищу, не может быть внутри, так как «по умолчанию» возвращается или работает с самым большим числом, которое было внутри коллекции.

1: есть ли смены чувствительности? Предполагая, что я включаю диапазон от 1 до 5, и для меня 4 имеет более высокий приоритет, чем остальные, которые будут работать по назначению?

switch(number) 
{ 
case 4: DoFancyStuff(); break; 
case 3: NotTooFancy(); break; 
case 1: StillOk(); break; 
case 2: Bad(); break; 
case 5: SuperBad(); break; 
default:break; 
} 

В любом случае, далее предположим, что число упорядочено по убыванию. Но теперь я не знаю возможного диапазона number, это может быть 2, 4, 8, 16 и так далее, но может отсутствовать номер: 2, 4, 16, ...

Так что если у меня есть сказать

switch(number) 
{ 
case 32: Nice(); break; 
case 64: OkToo(); break; 
case 128: Nah(); break; 
case 8: OkStillTakeIt(); break; 
default: break; 
} 

Итак, как числа упорядочены по порядке, большие приходят первый нисходящий, но они не имеют самый высокий приоритет не может быть числом приходит с наивысшим (приоритет) один (первый случай), но также не нужно ... и если никто не подходит, я хочу взять верхний, но это «потеряно».

Как это исправить? Или я просто переоцениваю? Неправильный подход? Мой мозг взрывается от размышлений об этом.

+1

Почему вы не экспериментировать с ним первым , тогда у вас должен быть ваш ответ. –

+0

Да, снимите вниз, после того, как я добавил свое уточнение, что делает мой вопрос более разумным ...? – sceiler

+0

Пока я написал ответ на вопрос верхнего уровня, вы покрываете много земли. Я рекомендую вернуться и переосмыслить ваш подход и написать новый вопрос с четким определением того, что вы пытаетесь достичь, и тем, как ваш подход терпит неудачу. –

ответ

6

Все случаи в switch должны быть взаимоисключающими, поэтому нет принципиальной концепции приоритета. В одном и том же коммутаторе 2 случая не могут быть допущены.

Для получения дополнительной информации см. switch (C# Reference).

+0

Да, одно число равно либо 1, либо 2, а число одновременно равно 1 и 2. – DLeh

+0

да, конечно, извините. Я забыл добавить, что переключатели внутри цикла for, который перебирает набор чисел среди других – sceiler

0

Не отвечает: OP не ищет проверки диапазона. Не удалять, чтобы другие не могли ответить на них.


Это звучит, как вы ожидаете switch проверить диапазоны значений - это не так, она позволяет проверить определенные значения.

Если вам необходимо проверить диапазоны - несколько if проверок хороший вариант:

if (value < 10) {...} // 0-9 
else if (value < 100) {...} //10-99 
else {...} // 100+ 

Для более диапазонов - список диапазонов и бинарный поиск может быть лучшим вариантом

+0

no i dont. извините, я добавил больше информации в качестве пояснения. Я забыл упомянуть цикл и набор чисел – sceiler

0

Порядок, в распределительном заявлении отсортирован совершенно не имеет значения. Думайте о них, как if, но все они являются исключительными случаями, которые не могут пересекаться. Число не может быть 1 и 2 в то же время, поэтому, если 1 вводит заявление switch, он всегда будет обращаться к case 1, независимо от того, где он находится, и игнорировать любые другие случаи.

Для удобства обслуживания я бы рекомендовал вам привести их в порядок, чтобы ваши случаи были легко найти.

0

Приоритет - это не понятие, которое имеет значение в инструкции switch.Короткий ответ заключается в том, что код будет работать сверху донизу, проверяя ваше значение по каждому из случаев в очереди до тех пор, пока не будет найдено ни одно, либо по умолчанию.

Теперь, когда сказано, что порядок часто очень важен, когда вы говорите о частоте определенного значения. Если вы знаете из своего проекта, что определенный случай будет намного более частым, чем другие числа, тогда вам разумно поставить это число в качестве первого случая в инструкции switch, чтобы минимизировать количество проверок.

Для некоторых сценариев, компилятор может optimize the switch statement в постоянное время ветвь, известная как таблица переходов, в этом случае это не имеет значения, в какой порядок дел были.

+0

Не обязательно верно, что коммутатор будет сравнивать входное значение с каждым из значений case. Часто (по крайней мере для интегральных типов) коммутатор переводится в один или несколько (кодов операций переключения) [https://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.switch%28v= vs.110% 29.aspx], который является таблицей переходов. – Kyle

+0

У вас нет связи, но я говорил концептуально, не обязательно о базовой реализации. –

+0

[Вот фиксированная ссылка] (https://msdn.microsoft.com/en-us/library/system.reflection.emit .opcodes.switch% 28v = vs.110% 29.aspx) Кроме того, ваша рекомендация о том, что порядок важен, когда речь идет о частоте, зависит от базовой реализации. Таблица перехода может разветвляться за время примерно независимо от количества элементов в таблице (в пределах разумного). Эта рекомендация не обязательно верна. – Kyle

Смежные вопросы