gpt4 book ai didi

c# - 嵌套开关表达式

转载 作者:行者123 更新时间:2023-12-05 01:12:45 25 4
gpt4 key购买 nike

我有以下使用 switch 表达式的语句:

var levelType = task switch
{
var t when t.Status == TaskStatus.EXECUTING && t.PlanIDs.Contains(currentPlan.ID) => WorkplaceAssociatedLevelTypes.Critical,
var t when t.Status == TaskStatus.WAITING && t.PlanIDs.Contains(currentPlan.ID) => WorkplaceAssociatedLevelTypes.Warning,
_ => WorkplaceAssociatedLevelTypes.Untyped
};

正如我们所见,t.PlanIDs.Contains(currentPlan.ID) 重复了两次,我想避免它。

我不确定是否可以使用 switch 表达式执行嵌套语句。

类似下面的内容:

var levelType = task switch
{
case (task.PlanIDs.Contains(currentPlan.ID))
true:
var t when t.Status == TaskStatus.EXECUTING => WorkplaceAssociatedLevelTypes.Critical,
var t when t.Status == TaskStatus.WAITING => WorkplaceAssociatedLevelTypes.Warning,
_ => WorkplaceAssociatedLevelTypes.Untyped
false: WorkplaceAssociatedLevelTypes.Untyped
};

上面的代码无法编译,我发明这个只是为了演示我在寻找什么。

使用 if-else 有效:

var levelType = WorkplaceAssociatedLevelTypes.Untyped;

if (task.PlanIDs.Contains(currentPlan.ID))
{
if (task.Status == TaskStatus.EXECUTING)
{
levelType = WorkplaceAssociatedLevelTypes.Critical;
}
else if (task.Status == TaskStatus.WAITING)
{
levelType = WorkplaceAssociatedLevelTypes.Warning;
}
}

最佳答案

switch 表达式的语法不会因为你想嵌套它们而改变,它一直都是一样的。

([expr] switch {
[case] => [expr],
})

([expr] switch {
[case] => ([expr] switch {
[case] => [expr]
}),
})

在你的情况下:

var levelType = task.PlanIDs.Contains(currentPlan.ID) switch
{
true => t.Status switch
{
TaskStatus.EXECUTING => WorkplaceAssociatedLevelTypes.Critical,
TaskStatus.WAITING => WorkplaceAssociatedLevelTypes.Warning,
_ => WorkplaceAssociatedLevelTypes.Untyped,
},
_ => WorkplaceAssociatedLevelTypes.Untyped,
};

尽管您可能只使用一个 switch 表达式:

var levelType = task.Status switch
{
// cases are evaluated in the order they are given
_ when !task.PlanIDs.Contains(currentPlan.ID) => WorkplaceAssociatedLevelTypes.Untyped,
TaskStatus.EXECUTING => WorkplaceAssociatedLevelTypes.Critical,
TaskStatus.WAITING => WorkplaceAssociatedLevelTypes.Warning,
_ => WorkplaceAssociatedLevelTypes.Untyped,
};

考虑到您使用的是 bool 表达式,我可能会选择使用条件表达式:

var levelType = task.PlanIDs.Contains(currentPlan.ID)
? task.Status switch
{
TaskStatus.EXECUTING => WorkplaceAssociatedLevelTypes.Critical,
TaskStatus.WAITING => WorkplaceAssociatedLevelTypes.Warning,
_ => WorkplaceAssociatedLevelTypes.Untyped,
}
: WorkplaceAssociatedLevelTypes.Untyped;

关于c# - 嵌套开关表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61583622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com