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 носа не подточит
решение чего?
-------
Проблемы двух и более срабатывающих кэйсов в одном свитче.
А решение - последовательное вычисление каждого условия... и - да - результат начинает зависеть от положения селектора, но прикладники сказали что им пофиг...