Оценка выражений в операторах с коммутацией в С#
Я должен выполнить следующее в инструкции switch
:
switch(num)
{
case 4:
// some code ;
break;
case 3:
// some code ;
break;
case 0:
// some code ;
break;
case < 0:
// some code ;
break;
}
Возможно ли, чтобы оператор switch оценил case < 0
? Если нет, как я могу это сделать?
Ответы
Ответ 1
Вы не можете - switch/case - только для отдельных значений. Если вы хотите указать условия, вам нужно "if":
if (num < 0)
{
...
}
else
{
switch(num)
{
case 0: // Code
case 1: // Code
case 2: // Code
...
}
}
Ответ 2
Я знаю, что эта тема довольно старая, но если кто-то все еще ищет ответ в С# 7, это возможно. Вот пример:
switch (value)
{
case var expression when value < 0:
//some code
break;
case var expression when (value >= 0 && value < 5):
//some code
break;
default:
//some code
break;
}
Ответ 3
Вы можете сделать что-то подобное в конце вашего оператора switch:
default:
if(num < 0)
{
... // Code
}
break;
Ответ 4
Если ваше число не может быть меньше нуля:
public int GetSwitch(int num) { return num < 0 ? -1 : num; }
switch(GetSwitch(num))
{
case 4: // some code ; break;
case 3:// some code ; break;
case 0: // some code ; break;
case -1 :// some code ; break;
}
Если это возможно, используйте другое "несуществующее" число, такое как int.MinValue.
Ответ 5
вы можете сделать это
switch (mark)
{
case int n when n >= 80:
Console.WriteLine("Grade is A");
break;
case int n when n >= 60:
Console.WriteLine("Grade is B");
break;
case int n when n >= 40:
Console.WriteLine("Grade is C");
break;
default:
Console.WriteLine("Grade is D");
break;
}
Ответ 6
Вам нужно будет использовать, если хотите, хотите или нет. Коммутатор способен сравнивать ваше значение с постоянными значениями.
Ответ 7
Единственный способ, о котором я мог думать (и я действительно не рекомендую его), будет следующим:
int someValue;
switch (Math.Max(someValue, -1))
{
case -1:
// will be executed for everything lower than zero.
break;
case 0:
// will be executed for value 0.
break;
case 1:
// will be executed for value 1.
break;
default:
// will be executed for anything else.
break;
}
Ответ 8
Возможно также и наоборот (относящийся к ответу Джона Скита):
switch(num)
{
case a:
break;
default:
if( num < 0 )
{}
break;
}
Ответ 9
Что вы могли бы сделать, это использовать делегата, как это.
var actionSwitch = new Dictionary<Func<int, bool>, Action>
{
{ x => x < 0 , () => Log.Information("0")},
{ x => x == 1, () => Log.Information("1")},
{ x => x == 2, () => Log.Information("2")},
{ x => x == 3, () => Log.Information("3")},
{ x => x == 4, () => Log.Information("4")},
{ x => x == 5, () => Log.Information("5")},
};
int numberToCheck = 1;
//Used like this
actionSwitch.FirstOrDefault(sw => sw.Key(numberToCheck)).Value();
Просто поменяйте местами то, что вы не хотите выполнять, где находится Log.Information("x"), и у вас есть выражение "switch".
Вам потребуется некоторая обработка ошибок, если вы проверите ключ, который "найден" Func.
Если вам нравится видеть версию коммутатора в Func, я только что написал пост в блоге с главой, посвященной примеру Switch.
Ответ 10
Вы не можете использовать сравнения в таких переключателях, как в VB, у вас есть 2 варианта, замените значение, которое вы включаете, с известным значением, и используйте это или - если вы имеете в виду все остальные случаи - вы можете использовать предложение по умолчанию:
switch(num)
{
case 4:
// some code ;
break;
case 3:
// some code ;
break;
case 0:
// some code ;
break;
default:
// some code ;
break;
}
Обратите внимание, что это не так, как вы просили: любые значения, отличные от 0,3,4, попадут в предложение deafult:.
Ответ 11
Недавно я столкнулся со следующим паттерном, и хотя я ненавижу его, я не могу утверждать, что он не практичен:
switch(0)
{
case 0 when x < 0:
...
break;
case 0 when a > 5 && x == 0:
...
break;
}
Использование фиктивных выражений ((0)
в коммутаторе и case 0
) абсолютно ужасно, и я не хотел бы, чтобы оно стало идиомой, но эй - оно краткое и очень ясное. Наверняка это не какой-то взлом, который полностью затеняет смысл и требует тайных знаний. Но С# преуспел бы, чтобы устранить потребность в этом. Мне бы хотелось, чтобы следующее было законным:
switch // maybe () here, if the grammar would demand
{
case when x < 0: // I like the case to stay
...
case when a > 5 && x == 0:
...
}