Вопрос по c#, switch-statement – Переключить регистр, проверить диапазоны в C # 3.5

11

В C #switch оператор не позволяет случаям охватывать диапазоны значений. Мне не нравится идея использовать для этой цели циклы if-else, так есть ли другие способы проверки числовых диапазонов в C #?

Насколько велики диапазоны? leppie
stackoverflow.com/questions/68578/multiple-cases-in-switch  Вы не можете сделать это в C #. Проверьте ответ выше. nXqd
Important note : Диапазоны поддерживаются в случае переключения, начиная с C # v7 -Switch case: can I use a range instead of a one number, Так что, если вы хотите лучше перейти с C # v3.5 на v7. RBT
Хорошо, у вас может быть метод, возвращающий bool, который принимает диапазон, а затем if loop, он простой, читаемый и хорошо работает V4Vendetta
Вы действительно не можете сделать это в C # (если это не маленький диапазон чисел, который вы можете перечислить в блоках), но, на этот раз, выcan в VB.Net -stackoverflow.com/questions/1009902/… как ни странно dash

Ваш Ответ

7   ответов
-1

Что-то вроде вложенных-сокращенных if-else работает и является чистым.

myModel.Value = modelResult >= 20 ? 5 : modelResult >= 14 ? 4 : modelResult >= 5 ? 3 : modelResult >= 2 ? 2 : modelResult == 1 ? 1 : 0;
Это ужасно
какая-либо причина для понижения? Я превратил 20 строк кода в 1.
1
        int b;
        b = Int32.Parse(textBox1.Text);

        int ans = (100-b)/3; //the 3 represents the interval
        //100 represents the last number


        switch(ans)
        {

           case 0:
                MessageBox.Show("98 to 100");
           break;

           case 1:
                MessageBox.Show("95 to 97");
           break;

           case 2:
                MessageBox.Show("92 to 94");
           break;

           case 3:
                MessageBox.Show("89 to 91");
           break;

           case 4:
                MessageBox.Show("86 to 88");
           break;

           default:
                MessageBox.Show("out of range");
           break;
4

если интервал диапазонов постоянен, вы можете попробовать

        int num = 11;
        int range = (num - 1) / 10; //here interval is 10
        switch (range)
        {
            case 0:
                Console.Write("1-10");
                break; // 1-10
            case 1:
                Console.Write("11-20");
                break; // 11-20
            // etc...
        }

Выход будет:"11-20"
если интервал является переменным, используйтеif/else

5

Нету. Конечно, если диапазоны малы, вы можете использовать

case 4:
case 5:
case 6:
   // blah
   break;

подход, но кроме этого: нет. использованиеif/else.

15

Вы можете использоватьHashTable соответственноDictionary создать отображениеCondition => Action.

Пример:

class Programm
{
    static void Main()
    {
        var myNum = 12;

        var cases = new Dictionary<Func<int, bool>, Action>
        { 
            { x => x < 3 ,    () => Console.WriteLine("Smaller than 3")   } ,
            { x => x < 30 ,   () => Console.WriteLine("Smaller than 30")  } ,
            { x => x < 300 ,  () => Console.WriteLine("Smaller than 300") } 
        };

        cases.First(kvp => kvp.Key(myNum)).Value();
    }
}

Эта техника является общей альтернативойswitchособенно если действия состоят только из одной строки (например, вызов метода).

И если вы поклонник псевдонимов типа:

using Int32Condition = System.Collections.Generic.Dictionary<System.Func<System.Int32, System.Boolean>, System.Action>;
...
    var cases = new Int32Condition()
    { 
        { x => x < 3 ,    () => Console.WriteLine("Smaller than 3")   } ,
        { x => x < 30 ,   () => Console.WriteLine("Smaller than 30")  } ,
        { x => x < 300 ,  () => Console.WriteLine("Smaller than 300") } 
    };
Интересно, но если бы я видел этот шаблон как замену if / else в реальном проекте, я представляю егоthedailywtf.com :)
Но вы не должны брать словарь (взять список KeyValuePair, Tuple или sth самостоятельно), в противном случае вы не можете предсказать, в каком порядке будут вызываться Funcs для тестирования.
+1 за хорошую идею
Это решение просто смешно. Хорошо для викторины, но очень плохо для производственного кода. Он медленный, поскольку тратит впустую память и вызывает слишком много вызовов, которые не могут быть встроены.
Этот код даже неwork, Поскольку словарь по порядку неупорядочен, вы не можете быть уверены, чтоx < 3 будет проверено раньшеx < 30, То, что это происходит в одном или двух тестовых случаях, не означает, что оно будет выполнено.Dictionary здесь просто неправильная структура данных, если только вы не гарантируете, что методы могут быть вызваны в любом порядке (что вы не сделали). Как отметил Оливер, список кортежей будет одним из способов обеспечения порядка и является семантически правильным. Обратите внимание, что это на самом деле ничем не отличается от серииif/else if заявления тоже.
1

Попробуйте что-то вроде этого

 private void ExecuteInRange(Dictionary<Range,Action<int>> ranges)
    {
        foreach (var range in ranges)
        {
            if (range.Key.Value < range.Key.Max && range.Key.Value > range.Key.Max)
                range.Value(range.Key.Value);
        }
    }


public class Range
{
    public int Min { get; set; }
    public int Max { get; set; }
    public int Value { get; set; }
}
1

Нет. По крайней мере, ничего более красивого.

Также нет только C # 3.5 .NET 3.5 и C # 3.0

Похожие вопросы