【问题标题】:Simplify a select case statement to avoid DRY简化 select case 语句以避免 DRY
【发布时间】:2016-10-31 07:18:30
【问题描述】:

如何重构此代码以避免重复自己?特别是如果有更多的案例!我已经阅读了有关使用字典简化选择案例的信息,但我不知道在这种情况下如何使用它。有什么建议吗?

    Dim sPath As String = String.Empty
    Dim aThing As Decimal

    Select Case True
        Case (aThing < 7.5)
            sPath = "~/images/Grafik_7.5.png"
        Case (aThing >= 7.5 AndAlso aThing < 8.75)
            sPath = "~/images/Grafik_18.75.png"
        Case (aThing >= 58.75 AndAlso aThing < 60)
            sPath = "~/images/Grafik_60.png"
        Case (aThing >= 60 AndAlso aThing < 61.25)
            sPath = "~/images/Grafik_61.25.png"
        Case (aThing >= 61.25 AndAlso aThing < 62.5)
            sPath = "~/images/Grafik_62.5.png"
        Case (aThing >= 62.5 AndAlso aThing < 63.75)
            sPath = "~/images/Grafik_63.75.png"
        Case (aThing >= 63.75 AndAlso aThing < 65)
            sPath = "~/images/Grafik_65.png"
        Case (aThing >= 65 AndAlso aThing < 66.25)
            sPath = "~/images/Grafik_66.25.png"
        Case (aThing >= 66.25)
            sPath = "~/images/Grafik_67.5.png"
    End Select

【问题讨论】:

  • 如果您确实想坚持使用 Select Case,则没有必要在每个 Case 上指定下限,因为您已经保证通过不匹配之前的任何一个来满足这一点案例。

标签: vb.net select refactoring dry


【解决方案1】:

使用字典,你可以这样做:

Dim conditions = new Dictionary(of Predicate(of Double), String) From
{
    {Function(a) a < 7.5, "Grafik_7.5.png"},
    {Function(a) a >= 7.5 AndAlso a <= 8.75, "Grafik_8.75.png"},
    {Function(a) a >= 58.75 AndAlso a < 60, "Grafik_60.png"} 
}

Dim aThing = 8.3
Dim result = conditions.Single(Function (c) c.Key(aThing)).Value

但请注意,字典没有排序,因此请确保只有一个函数对任何给定值返回 True。

另一种方法是动态创建文件名,如下所示:

Dim sizes = new List(Of Double) From {7.5, 8.75, 60, 61.25} 

Dim InvC = System.Globalization.CultureInfo.InvariantCulture
DIm size = sizes.First(Function(s) s > aThing).ToString(InvC)

Dim result = "Grafik_" + size + ".png"

【讨论】:

    【解决方案2】:

    这可能需要根据最大数值稍微改变,但我在想这样的事情:

        Dim values = {7.5D, 18.75D, 60D, 61.25D} 'etc.
        Dim value = values.First(Function(x) x > aThing)
    
        sPath = $"~images/Grafik_{value}.png
    

    【讨论】:

    • 你应该使用InvariantCulture;否则,根据运行此代码的机器的文化设置,sPath 可能是例如...Grafik_18,75.png 而不是 ...Grafik_18.75.png
    • 确实如此,但我确实说过类似这样的话。
    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2019-08-02
    相关资源
    最近更新 更多