Или через прямой доступ к строке :
$string[strlen($string)-1];
Обратите внимание, что это не работает для многобайтовых строк. Если вам нужно работать с многобайтовой строкой, рассмотрите возможность использования семейства функций mb_*
.
С PHP 7.1.0 также поддерживаются отрицательные числовые индексы, например, просто $string[-1];
Нет никакого синтаксиса в C++, ни C# для второго метода, который Вы упомянули.
нет ничего неправильно с Вашим первым методом. Если однако у Вас есть очень большие диапазоны, просто используйте серию если операторы.
gcc реализует расширение языка C для поддержки последовательных диапазонов:
switch (value)
{
case 1...3:
//Do Something
break;
case 4...6:
//Do Something
break;
default:
//Do the Default
break;
}
Редактирование : Просто замеченный C# наклеивают вопрос, поэтому по-видимому, ответ gcc не помогает.
Один менее известный фасет переключатель в C# - то, что это полагается оператор = и так как это может быть переопределено, у Вас могло быть что-то вроде этого:
string s = foo();
switch (s) {
case "abc": /*...*/ break;
case "def": /*...*/ break;
}
Другая опция состояла бы в том, чтобы использовать стандартную программу. Если случаи 1-3 все выполняются, та же логика тогда обертывают ту логику в стандартную программу и называют его для каждого случая. Я знаю, что это на самом деле не избавляется от операторов выбора, но это действительно реализует хороший стиль и сводит обслуживание к минимуму.....
[Редактирование] Добавленная альтернативная реализация для соответствия исходному вопросу... [/Редактирование]
switch (x)
{
case 1:
DoSomething();
break;
case 2:
DoSomething();
break;
case 3:
DoSomething();
break;
...
}
private void DoSomething()
{
...
}
Высокий звук
switch (x)
{
case 1:
case 2:
case 3:
DoSomething();
break;
...
}
private void DoSomething()
{
...
}
. СЕТЕВАЯ Платформа 3.5 имеет диапазоны:
, с которым можно использовать его, "содержит" и оператор IF, так как как кто-то сказал, что Оператор переключения использует "==" оператор.
Здесь пример:
int c = 2;
if(Enumerable.Range(0,10).Contains(c))
DoThing();
else if(Enumerable.Range(11,20).Contains(c))
DoAnotherThing();
, Но я думаю, что мы можем развлечься еще больше: так как Вам не будут нужны возвращаемые значения, и это действие не берет параметры, можно легко использовать действия!
public static void MySwitchWithEnumerable(int switchcase, int startNumber, int endNumber, Action action)
{
if(Enumerable.Range(startNumber, endNumber).Contains(switchcase))
action();
}
старый пример с этим новым методом:
MySwitchWithEnumerable(c, 0, 10, DoThing);
MySwitchWithEnumerable(c, 10, 20, DoAnotherThing);
, Так как Вы передаете действия, не значения, необходимо опустить круглую скобку, это очень важно. Если Вы нуждаетесь в функции с аргументами, просто изменяете тип Action
к Action<ParameterType>
. При необходимости в возвращаемых значениях используйте Func<ParameterType, ReturnType>
.
В C# 3.0 нет никакого легкого Частичное Приложение для инкапсуляции факта, параметр случая является тем же, но Вы создаете немного вспомогательного метода (немного подробный, tho).
public static void MySwitchWithEnumerable(int startNumber, int endNumber, Action action){
MySwitchWithEnumerable(3, startNumber, endNumber, action);
}
Здесь пример того, как новый функциональный импортированный оператор, по моему скромному мнению, более мощен и изящен, чем старый обязательный.
Этот синтаксис от Выбора Visual Basic ... Оператор выбора :
Dim number As Integer = 8
Select Case number
Case 1 To 5
Debug.WriteLine("Between 1 and 5, inclusive")
' The following is the only Case clause that evaluates to True.
Case 6, 7, 8
Debug.WriteLine("Between 6 and 8, inclusive")
Case Is < 1
Debug.WriteLine("Equal to 9 or 10")
Case Else
Debug.WriteLine("Not between 1 and 10, inclusive")
End Select
Вы не можете использовать этот синтаксис в C#. Вместо этого необходимо использовать синтаксис от первого примера.
Можно не учесть новую строку, которая дает Вам:
case 1: case 2: case 3:
break;
, но я рассматриваю тот плохой стиль.
В C# 7 мы теперь имеем Сопоставление с образцом , таким образом, можно сделать что-то как:
switch (age)
{
case 50:
ageBlock = "the big five-oh";
break;
case var testAge when (new List<int>()
{ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 }).Contains(testAge):
ageBlock = "octogenarian";
break;
case var testAge when ((testAge >= 90) & (testAge <= 99)):
ageBlock = "nonagenarian";
break;
case var testAge when (testAge >= 100):
ageBlock = "centenarian";
break;
default:
ageBlock = "just old";
break;
}
Полагаю, что на этот вопрос уже был дан ответ. Однако я думаю, что вы все еще можете смешать оба варианта синтаксически лучшим образом, сделав:
switch (value)
{
case 1: case 2: case 3:
// Do Something
break;
case 4: case 5: case 6:
// Do Something
break;
default:
// Do Something
break;
}