60521


以下のようなコードで値が0と1の時の処理をまとめたいのですが、Switch式でそれは可能でしょうか？環境は、.Net Core 3.0です。

[code]

    var res = val switch {
      0 => A(),
      1 => A(),
      2 => B(),
      _ => throw new Exception()
    };
    
[/code]


CC BY-SA 4.0
2019-11-13T20:00:49.550
60494
2019-11-14T14:30:55.210
34135
question
c# .net-core
C#でのSwitch式で同処理を複数条件下で分岐したい場合


F#だとORパターンがあるので書けるんですが、

[code]

    let res = match ``val`` with
              | 0 | 1 -> A()
              | 2     -> B ()
              | _     -> failwith ""
    
[/code]

C#だとパターンは発展途上なため書きようがないかも。

[code]

    var res = val switch {
      _ when val == 0 || val == 1 => A(),
      2 => B(),
      _ => throw new Exception(),
    };
    
[/code]


CC BY-SA 4.0
2019-11-13T20:49:15.853
60495
2019-11-13T20:49:15.853
4236
60494
answer


出来ない状況に変わりは無いですが、C# 9.0に向けて機能追加が議論されているようです。

[Multiple switch cases? #15241](https://github.com/dotnet/docs/issues/15241)  
[Proposed changes for Pattern Matching in C# 9.0 - Draft Specification
#2850](https://github.com/dotnet/csharplang/issues/2850)  
いろんな書き方が提案され、結構長い記事になっています。

以下は @sayuri さん回答と同等内容の英語版記事  
[c# 8 switch expression multiple cases with same
result](https://stackoverflow.com/q/56676260/9014308)

こちらは C# 9.0への提案に言及した記事  
[Multiple cases in c# 8.0 switch
expressions](https://stackoverflow.com/q/55510463/9014308)


CC BY-SA 4.0
2019-11-14T12:33:00.560
60521
2019-11-14T14:26:01.010
2019-11-14T14:26:01.010
26370
26370
60494
answer


三項演算子(ternary operator)を使う方法も考えられます。

[code]

    using System;
    
    public class Program
    {
        public static void Main()
        {
            test(0);
            test(1);
            test(2);
            test(3);
        }
    
        static void test(int val) {
            var res = (val == 1 ? 0 : val) switch {
                0 => A(), // 0 or 1
                2 => B(),
                _ => throw new Exception()
            };
            Console.WriteLine("{0}: {1}", val, res);
        }
    
        static string A() { return "A"; }
        static string B() { return "B"; }
    }
    
[/code]

**実行結果**

[code]

    0: A
    1: A
    2: B
    Unhandled exception. System.Exception: Exception of type 'System.Exception' was thrown.
       at Program.test(Int32 val)
       at Program.Main()
    Command terminated by signal 6
    
[/code]

Playground: [C# Online Compiler | .NET
Fiddle](https://dotnetfiddle.net/w4wEQB)


CC BY-SA 4.0
2019-11-14T14:20:39.873
60522
2019-11-14T14:30:55.210
2019-11-14T14:30:55.210
60494
answer