C# - pattern matching - many discards
Два дискарда это нехорошо для switch expression
Отчего хотя - бы так? или более привычно через switch statement
var ret = row switch
{
Row { Age: > 100 } => MyEnum.Died,
Row { Age: <= 100 } => MyEnum.StillAlive,
_ => MyEnum.NotAllowed
};
ну тогда и ничего обсуждать о подобной программе, делайте как нравится и будет счастливы.
Ну так я и спросил, как бы вы сделали в подобном случае. Просто обычно везде один дискард для всех необработанных кейсов используется, а у меня получается, что можно дискард как костыль использовать для кейсов, когда надо сравнить что-то не с самой переменной свича.
Не, это ещё больший костыль - объекты создавать лишь для сравнения с константой.
А этот паттерн с созданием нового объекта с проверкой при инициализации - он вообще трудночитаем. Без подробного пояснения, что там происходит, непонятно.
Дискард с условием when проще и понятнее.
объекты создавать лишь для сравнения с константой.
где создание объекта? ![]()
Можно и так написать
var ret = row switch
{
{ Age: > 100 } => MyEnum.Died,
{ Age: <= 100 } => MyEnum.StillAlive,
_ => MyEnum.NotAllowed
};
Это же и есть создание объекта, только анонимного. Нет?
Дискард с условием when проще и понятнее.еще большая белиберда
Скажем так - дискард с when позволяет провести проверку, не привязанную к параметру свича.
дискард с when позволяет провести проверку, не привязанную к параметру свича.
Не совсем так... Извращаться можно по разному
int a = 2;
MyEnum ret = row switch
{
{ Age: > 100 } when a == 2 => MyEnum.Died,
{ Age: <= 100 } => MyEnum.StillAlive,
_ => MyEnum.NotAllowed
}
Скажем так - дискард с when позволяет провести проверку, не привязанную к параметру свича...
...и при этом иметь меньше мусора и извращений. Добавить не нужный мне здесь символ подчёркивания - меньшее из зол.
Добавить не нужный мне здесь символ подчёркивания
Это и есть очень большая проблема. discard pattern ... that doesn't have the corresponding member of the Direction enumeration
https://learn.microsoft.com/en-us/dotnet/csharp/language-r...
То бишь, это то, что должно выполнятся когда ничего не совпадает. И енто обычно одно и только одно.
А тут к этому одному добавляется еще и условие (и может не одно). Очень ломает привычный паттерн использования. Вместо одного ожидаемого дискарда их фиг знает сколько и ради чего?
я чот не пойму, а что в этом варианте не по фен-шую?
var result = row?.Age switch
{
null => MyEnum.NotAllowed,
> 100 => MyEnum.Died,
_ => MyEnum.StillAlive,
};И енто обычно одно и только одно.
-------
хи-хи... Я его об этом уже спрашивал...
Решение, кстати, есть.Но! оно - медленное...
я чот не пойму, а что в этом варианте не по фен-шую?
Я тоже не пойму. Вот и спрашиваю - у кого тут это не по феншую?
И енто обычно одно и только одно.
-------
хи-хи... Я его об этом уже спрашивал...
Решение, кстати, есть.Но! оно - медленное...
Я вроде отвечал - иногда охото сравнить разнотиповые значения, а вернуть - одого типа. Скажем, проверить одну переменную double на пачку диапазонов, и вторую строковую переменную - на пару значений. А вернуть что-то из enum, например. Или вот тут что непонятного - делаю проверку всего объекта на налл, затем свойства этого объекта - ещё как-то, и кейс для всех остальных вариантов? И делаю это не пачкой if-else, а в несколько компактных строчек. Усложнил свой первоначальный пример - сколько это расписывать деревом if-else?
var (result, message) = (row, flag) switch
{
(null, _) => (MyEnum.NotAllowed, null),
(_, Flags.CantDie) when row.Age > 100 => (MyEnum.Immortal, LocalizedStrings.Immortal),
(_, _) when row.Age > 100 => (MyEnum.Died, LocalizedStrings.Died),
(_, _) => (MyEnum.StillAlive, LocalizedStrings.Alive),
};А вдруг...?
ну так для этого есть нормальные условия. А иначе получается следующее:
switch(x){
case b:... break;
case c:... break;
...
default when(a==5):...break;
default :...break;
}
Вот и спрашиваю - у кого тут это не по феншую?
это я твой код чуть переделал, остался только один дискард. Комар AlexNek носа не подточит
решение чего?
-------
Проблемы двух и более срабатывающих кэйсов в одном свитче.
А решение - последовательное вычисление каждого условия... и - да - результат начинает зависеть от положения селектора, но прикладники сказали что им пофиг...

