C#有没有等同于Elixir的"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

上面的程序生成以下结果−

你猜的是46!

(示例派生自tutorialpoint,但进一步演示了并非每个表达式都必须包含相同的变量)

c#有类似的东西吗?还是我需要使用if/else?

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

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."
}
);

请注意,在第一支中,我匹配了任何内容(下划线_模式),但只有当numberofguess>5"。在这种情况下,你甚至可以做更花哨的模式匹配:

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

当然,这不是在所有情况下都可能的。

如果所有的臂都是不相关的条件,使用这种_ when ...结构感觉有点滥用,因此,您可以使用三元操作符链:

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

虽然我觉得即使这第一眼也会有点惊讶。

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

相关内容

  • 没有找到相关文章

最新更新