有没有更简洁的方式在这里使用 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
当然,如果你只想返回True
或False
,那么简单返回比较的结果可能会更简洁:
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?的主要内容,如果未能解决你的问题,请参考以下文章
有没有更简洁的方式来在 TypeScript 中表示这个 JSON 对象?