Deutsch

C# - pattern matching - many discards

9000  1 2 3 4 5 6 7 8 9 10 все
AlexNek патриот22.02.24 22:33
AlexNek
NEW 22.02.24 22:33 
в ответ alex445 20.02.24 16:44

Два дискарда это нехорошо для switch expression

Отчего хотя - бы так? или более привычно через switch statement

            var ret = row switch
                {
                    Row { Age: > 100 } => MyEnum.Died,
                    Row { Age: <= 100 } => MyEnum.StillAlive,
                    _ => MyEnum.NotAllowed
                };
#21 
alex445 коренной житель22.02.24 22:34
NEW 22.02.24 22:34 
в ответ AlexNek 22.02.24 19:26
ну тогда и ничего обсуждать о подобной программе, делайте как нравится и будет счастливы.

Ну так я и спросил, как бы вы сделали в подобном случае. Просто обычно везде один дискард для всех необработанных кейсов используется, а у меня получается, что можно дискард как костыль использовать для кейсов, когда надо сравнить что-то не с самой переменной свича.

#22 
alex445 коренной житель22.02.24 22:38
NEW 22.02.24 22:38 
в ответ AlexNek 22.02.24 22:33

Не, это ещё больший костыль - объекты создавать лишь для сравнения с константой.

А этот паттерн с созданием нового объекта с проверкой при инициализации - он вообще трудночитаем. Без подробного пояснения, что там происходит, непонятно.

Дискард с условием when проще и понятнее.

#23 
AlexNek патриот22.02.24 22:47
AlexNek
NEW 22.02.24 22:47 
в ответ alex445 22.02.24 22:38
объекты создавать лишь для сравнения с константой.


где создание объекта? шок


Можно и так написать

            var ret = row switch
                {
                    { Age: > 100 } => MyEnum.Died,
                    { Age: <= 100 } => MyEnum.StillAlive,
                    _ => MyEnum.NotAllowed
                };
#24 
AlexNek патриот22.02.24 22:49
AlexNek
NEW 22.02.24 22:49 
в ответ alex445 22.02.24 22:38
Дискард с условием when проще и понятнее.

еще большая белиберда смущ

#25 
alex445 коренной житель22.02.24 22:57
NEW 22.02.24 22:57 
в ответ AlexNek 22.02.24 22:47

Это же и есть создание объекта, только анонимного. Нет?

#26 
alex445 коренной житель22.02.24 23:08
NEW 22.02.24 23:08 
в ответ AlexNek 22.02.24 22:49
Дискард с условием when проще и понятнее.

еще большая белиберда смущ

Скажем так - дискард с when позволяет провести проверку, не привязанную к параметру свича.

#27 
AlexNek патриот22.02.24 23:39
AlexNek
NEW 22.02.24 23:39 
в ответ alex445 22.02.24 23:08
дискард с when позволяет провести проверку, не привязанную к параметру свича.

Не совсем так... Извращаться можно по разному


int a = 2;
MyEnum ret = row switch
{
    { Age: > 100 } when a == 2 => MyEnum.Died,
    { Age: <= 100 } => MyEnum.StillAlive,
    _ => MyEnum.NotAllowed
}
#28 
alex445 коренной житель23.02.24 21:25
NEW 23.02.24 21:25 
в ответ AlexNek 22.02.24 23:39, Последний раз изменено 23.02.24 21:26 (alex445)
Скажем так - дискард с when позволяет провести проверку, не привязанную к параметру свича...

...и при этом иметь меньше мусора и извращений. Добавить не нужный мне здесь символ подчёркивания - меньшее из зол.

#29 
AlexNek патриот23.02.24 21:42
AlexNek
NEW 23.02.24 21:42 
в ответ alex445 23.02.24 21:25
Добавить не нужный мне здесь символ подчёркивания

Это и есть очень большая проблема. discard pattern ... that doesn't have the corresponding member of the Direction enumeration

https://learn.microsoft.com/en-us/dotnet/csharp/language-r...

То бишь, это то, что должно выполнятся когда ничего не совпадает. И енто обычно одно и только одно.

А тут к этому одному добавляется еще и условие (и может не одно). Очень ломает привычный паттерн использования. Вместо одного ожидаемого дискарда их фиг знает сколько и ради чего?

#30 
Срыв покровов патриот24.02.24 00:07
NEW 24.02.24 00:07 
в ответ alex445 23.02.24 21:25

я чот не пойму, а что в этом варианте не по фен-шую?

var result = row?.Age switch
{
    null => MyEnum.NotAllowed,
    > 100 => MyEnum.Died,
    _ => MyEnum.StillAlive,
};
#31 
Murr патриот24.02.24 02:40
Murr
NEW 24.02.24 02:40 
в ответ AlexNek 23.02.24 21:42

И енто обычно одно и только одно.

-------

хи-хи... Я его об этом уже спрашивал...

Решение, кстати, есть.Но! оно - медленное...

#32 
AlexNek патриот24.02.24 11:28
AlexNek
NEW 24.02.24 11:28 
в ответ Murr 24.02.24 02:40
Решение, кстати, есть

решение чего? Но всё равно - давай.

#33 
alex445 коренной житель24.02.24 12:13
NEW 24.02.24 12:13 
в ответ AlexNek 23.02.24 21:42
Вместо одного ожидаемого дискарда их фиг знает сколько и ради чего?

А вдруг...?

#34 
alex445 коренной житель24.02.24 12:20
NEW 24.02.24 12:20 
в ответ Срыв покровов 24.02.24 00:07
я чот не пойму, а что в этом варианте не по фен-шую?

Я тоже не пойму. Вот и спрашиваю - у кого тут это не по феншую?

#35 
alex445 коренной житель24.02.24 12:25
NEW 24.02.24 12:25 
в ответ Murr 24.02.24 02:40, Последний раз изменено 24.02.24 12:38 (alex445)
И енто обычно одно и только одно.
-------
хи-хи... Я его об этом уже спрашивал...
Решение, кстати, есть.Но! оно - медленное...

Я вроде отвечал - иногда охото сравнить разнотиповые значения, а вернуть - одого типа. Скажем, проверить одну переменную 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),
};
#36 
AlexNek патриот24.02.24 12:25
AlexNek
NEW 24.02.24 12:25 
в ответ alex445 24.02.24 12:13
А вдруг...?

ну так для этого есть нормальные условия. А иначе получается следующее:

switch(x){
  case b:... break;
  case c:... break;
...
  default when(a==5):...break;
  default :...break;

}
#37 
alex445 коренной житель24.02.24 12:35
NEW 24.02.24 12:35 
в ответ AlexNek 24.02.24 12:25, Последний раз изменено 24.02.24 12:39 (alex445)
А вдруг...?
ну так для этого есть нормальные условия

Не всегда условия нормальные...


#38 
Срыв покровов патриот24.02.24 13:43
NEW 24.02.24 13:43 
в ответ alex445 24.02.24 12:20
Вот и спрашиваю - у кого тут это не по феншую?

это я твой код чуть переделал, остался только один дискард. Комар AlexNek носа не подточит

#39 
Murr патриот24.02.24 14:31
Murr
NEW 24.02.24 14:31 
в ответ AlexNek 24.02.24 11:28

решение чего?

-------

Проблемы двух и более срабатывающих кэйсов в одном свитче.

А решение - последовательное вычисление каждого условия... и - да - результат начинает зависеть от положения селектора, но прикладники сказали что им пофиг...

#40 
1 2 3 4 5 6 7 8 9 10 все