有没有更简洁的方式在这里使用 Select Case?

Posted

技术标签:

【中文标题】有没有更简洁的方式在这里使用 Select Case?【英文标题】:Is there a more concise way of using Select Case here? 【发布时间】:2020-03-15 20:04:47 【问题描述】:

我正在测试一个输入以查看它是否包含日语字符,这些字符属于某个 unicode 块。我可以使用 If,但我喜欢 Select Case 的简洁语法。话虽如此,我不太确定如何编写一个排除介于两个值之间的数字的“案例”。

这可行,但可能写得更简洁:

For Each c As Char In jpstring
    Select Case AscW(c)
        Case 12352 To 12543, 12784 To 12799

        Case Else
            Return False
    End Select
Next

我尝试做类似的事情:

Case Not 12352 To 12543, 12784 To 12799

但这不起作用,也不用像下面这样的括号括起来:

Case Not (12352 To 12543, 12784 To 12799)

有没有办法编写一个案例,以便它专门排除多个数字范围?

【问题讨论】:

注意。 here 描述的模式匹配建议模式之一将允许以您描述的第二种方式使用 Not 【参考方案1】:

AFAIK 无法让 Case 匹配排除范围。但是,您可以使用><

For Each c As Char In jpstring
    Select Case AscW(c)
        Case < 12352, 12544 To 12783, > 12799
            Return False
        Case Else

    End Select
Next

当然,如果你只想返回TrueFalse,那么简单返回比较的结果可能会更简洁:

For Each c As Char In jpstring
    Dim asc = AscW(c)
    Return asc < 12352 OrElse (asc >= 12544 AndAlso asc <= 12783) OrElse asc > 12799
Next

【讨论】:

我赞成这个答案,因为它有效,但@OP,如果你只有一种情况,我建议不要使用Select Case。在这种情况下,If 语句将更具可读性。 @AhmedAbdelhameed 不一定,因为您只能在 If 语句中测试单个条件(除非您包含明确的 Or 并重复正在测试的表达式);与 Select Case 不同,您可以在单个 Case 中进行多个测试。【参考方案2】:

一些 LINQ 怎么样?

Dim j() as Char = inputText.Select(Function(c) Ascw(c)).Where(Function(i) (i > 12351 AndAlso i < 12544) OrElse (i > 12783 AndAlso i < 12800))

制作一个扩展方法也可能是整理东西的好方法:

Module CharExtensions

    <Extension()> 
    Public Sub IsJapanese(c As char)
        Dim i = AscW(c)
        Return (i > 12351 AndAlso i < 12544) OrElse (i > 12783 AndAlso i < 12800
    End Sub
End Module



   Dim j() as Char = inputText.Where(Function(c) c.IsJapanese)

【讨论】:

以上是关于有没有更简洁的方式在这里使用 Select Case?的主要内容,如果未能解决你的问题,请参考以下文章

修改CAS源码是的基于DB的认证方式配置更灵活

是否有更简洁的 linq 方式来“联合”单个项目?

有没有更简洁的方式来在 TypeScript 中表示这个 JSON 对象?

Java中foreach添加String数组到List集合,有没有更简洁的方式?

有没有更简洁的 Coffeescript 成语呢?

使用 NGXS 订阅操作流的更简洁方式