C# - pattern matching - many discards
ну тогда и ничего обсуждать о подобной программе, делайте как нравится и будет счастливы.
Ну так я и спросил, как бы вы сделали в подобном случае. Просто обычно везде один дискард для всех необработанных кейсов используется, а у меня получается, что можно дискард как костыль использовать для кейсов, когда надо сравнить что-то не с самой переменной свича.
Не, это ещё больший костыль - объекты создавать лишь для сравнения с константой.
А этот паттерн с созданием нового объекта с проверкой при инициализации - он вообще трудночитаем. Без подробного пояснения, что там происходит, непонятно.
Дискард с условием 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...
То бишь, это то, что должно выполнятся когда ничего не совпадает. И енто обычно одно и только одно.
А тут к этому одному добавляется еще и условие (и может не одно). Очень ломает привычный паттерн использования. Вместо одного ожидаемого дискарда их фиг знает сколько и ради чего?
И енто обычно одно и только одно.
-------
хи-хи... Я его об этом уже спрашивал...
Решение, кстати, есть.Но! оно - медленное...
Я вроде отвечал - иногда охото сравнить разнотиповые значения, а вернуть - одого типа. Скажем, проверить одну переменную 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), };