在测试范围时是否有更多 C# 9 / .NET 5 惯用的表达方式 If/Else? (模式匹配或更新的 C# 功能)

Is there a more C# 9 / .NET 5 Idiomatic Way to Express If/Else when Testing Ranges? (Pattern Matching or newer C# features)

今天刚刚不得不为一个非常接近于此的项目编写一些代码:

private static string CreateColorFromPercentage(double percentage, bool isPrimaryGroup)
{
    if (isPrimaryGroup)
    {
        if (percentage >= 97.0)
        {
            return "#000000"; // black
        }
        else if (percentage > 80.0)
        {
            return "#FF0000"; // red
        }
        else
        {
            return "#FFA500"; // orange
        }
    }
    else
    {
        if (percentage > 97.5)
        {
            return "#000000"; // black
        }
        else if (percentage > 80.0)
        {
            return "#FFA500"; // orange
        }
        else
        {
            return "#008000"; // green
        }
    }
}

测试范围时是否有更多 C# 9 / .NET 5 惯用的表达方式 If/Else? Resharper 已经告诉我缩短/删除一些 else 语句。 是否有更像人类可读版本的“网格”?表达相同意图的更好方法,但读起来像 6 个简单的条件。谢谢

您可以使用嵌套 switch expressions:

    private static string CreateColorFromPercentage(double percentage, bool isPrimaryGroup)
    {
        return isPrimaryGroup switch
        {
            true => percentage switch
            {
                >= 97.0 => "#000000", // black
                > 80 => "#FF0000", // red
                _ => "#FFA500" // orange
            },
            false => percentage switch
            {
                > 97.5 => "#000000", // black
                > 80.0 => "#FFA500", // orange
                _ => "#008000" // green
            }
        };
    }

不会说这更“惯用”,但它可以更具可读性。

模式匹配和条件运算符确实可以使那一页长代码更具可读性:

private static string CreateColorFromPercentage(double percentage, bool isPrimaryGroup) => isPrimaryGroup 
    ? percentage switch { >= 97.0 => "#000000", > 80.0 => "#FF0000", _ => "##FFA500" }
    : percentage switch { >= 97.5 => "#000000", > 80.0 => "#FFA500", _ => "##008000" };

在 .NET 5 中,您应该能够像本例中那样使用模式匹配:

static string CreateColorFromPercentage(double percentage, bool isPrimaryGroup) {
    return (percentage, isPrimaryGroup) switch {
        (>= 97.0, true)  => "#000000",
        (> 80.0,  true)  => "#FF0000",
        (_,       true)  => "#FFA500",
        (>= 97.5, false) => "#000000",
        (> 80.0,  false) => "#FFA500",
        (_,       false) => "#008000"
    };
}