русский
Germany.ruForen → Архив Досок→ Programmierung

C# - pattern matching - many discards

22611  1 2 3 4 5 6 7 8 9 10 alle
AlexNek патриот22.02.24 22:33
AlexNek
NEW 22.02.24 22:33 
in Antwort 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 
in Antwort AlexNek 22.02.24 19:26
ну тогда и ничего обсуждать о подобной программе, делайте как нравится и будет счастливы.

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

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

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

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

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

#23 
AlexNek патриот22.02.24 22:47
AlexNek
NEW 22.02.24 22:47 
in Antwort 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 
in Antwort alex445 22.02.24 22:38
Дискард с условием when проще и понятнее.

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

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

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

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

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

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

#27 
AlexNek патриот22.02.24 23:39
AlexNek
NEW 22.02.24 23:39 
in Antwort 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 
in Antwort AlexNek 22.02.24 23:39, Zuletzt geändert 23.02.24 21:26 (alex445)
Скажем так - дискард с when позволяет провести проверку, не привязанную к параметру свича...

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

#29 
AlexNek патриот23.02.24 21:42
AlexNek
NEW 23.02.24 21:42 
in Antwort 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 
Срыв покровов gekickt bis 7/7/25 16:05 патриот24.02.24 00:07
NEW 24.02.24 00:07 
in Antwort 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 
in Antwort AlexNek 23.02.24 21:42

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

-------

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

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

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

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

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

А вдруг...?

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

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

#35 
alex445 коренной житель24.02.24 12:25
NEW 24.02.24 12:25 
in Antwort Murr 24.02.24 02:40, Zuletzt geändert 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 
in Antwort 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 
in Antwort AlexNek 24.02.24 12:25, Zuletzt geändert 24.02.24 12:39 (alex445)
А вдруг...?
ну так для этого есть нормальные условия

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


#38 
Срыв покровов gekickt bis 7/7/25 16:05 патриот24.02.24 13:43
NEW 24.02.24 13:43 
in Antwort alex445 24.02.24 12:20
Вот и спрашиваю - у кого тут это не по феншую?

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

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

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

-------

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

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

#40 
1 2 3 4 5 6 7 8 9 10 alle