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 语句中)。
在 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 ...
构造感觉有点滥用,所以或者,您可以使用
var x =
condition1 ?
someValue1 :
condition2 ?
someValue2 :
condition3 ?
someValue3 :
valueWhenNoConditionsAreTrue;
虽然第一眼就觉得连这个都有些astonishing
如果你想在这些分支中执行语句,而不是表达式,那么你应该只使用普通的 if-else-if 结构,或者如果模式匹配可以switch 语句(但请注意 _ when ...
技巧不能用在 switch 语句中)。