C# 是否有与 Elixir 的 `cond` 等效的东西?

Does C# have any equivalent to Elixir's `cond`?

在 Elixir 中,如果我想检查多个布尔条件,而不是一些丑陋的混乱的 if/else 逻辑,我可以优雅地这样做:

guess = 46
number_of_guesses = 3
cond do
   number_of_guesses > 5 -> 
      IO.puts "Too many guesses!  You lose."

   guess == 46 -> 
      IO.puts "You guessed 46!"

   guess == 42 -> 
      IO.puts "You guessed 42!"

   true        -> 
      IO.puts "I give up."
end

以上程序生成如下结果-

You guessed 46!

(源自 Tutorialspoint 的示例,但进一步证明并非每个表达式都必须包含相同的变量。)

C# 是否有类似的东西或者我需要使用 if/else?

如果您在几乎所有情况下都匹配一个值,您仍然可以使用 switch expression,带有大小写保护:

int guess = 46;
int numberOfGuesses = 3;
Console.WriteLine(
    guess switch {
        _ when numberOfGuesses > 5 => "Too many guesses!  You lose.",
        46 => "You guessed 46!",
        42 => "You guessed 42!",
        _ => "I give up."
    }
);

请注意,在第一臂中,我匹配了任何内容(下划线 _ 模式)但仅“当 numberOfGuesses > 5”时。或者在这种情况下,您甚至可以进行更高级的模式匹配:

Console.WriteLine(
    (guess, numberOfGuesses) switch
    {
        (_, > 5) => "Too many guesses!  You lose.",
        (46, _) => "You guessed 46!",
        (42, _) => "You guessed 42!",
        _ => "I give up."
    }
);

当然,这并非在所有情况下都可行。

如果所有的手臂都是不相关的条件,使用这种 _ when ... 构造感觉有点滥用,所以或者,您可以使用 of ternary operators:

var x = 
    condition1 ?
        someValue1 :
    condition2 ?
        someValue2 :
    condition3 ?
        someValue3 :
    valueWhenNoConditionsAreTrue;

虽然第一眼就觉得连这个都有些astonishing

如果你想在这些分支中执行语句,而不是表达式,那么你应该只使用普通的 if-else-if 结构,或者如果模式匹配可以switch 语句(但请注意 _ when ... 技巧不能用在 switch 语句中)。