检查一个字符串是否不等于一组字符串中的任何一个

15

有没有一种方法可以将类似下面的代码转换:

If someString <> "02" And someString <> "03" And someString <> "06" And someString <> "07" Then
     btnButton.Enabled = False
End If

有点喜欢这样的东西(一个变量有多个值)

If someString <> "02", "03", "06", "07" Then
     btnButton.Enabled = False
End If

1
在C#中,您可以执行if (!(new [] {"02", "03", "06", "07"}).Contains(someString)) { .. - 但我不会说VB.Net。 - Blorgbeard
1
各种字符串在一个数组中吗?@Blorgbeard 是的,这就是我想要达到的目的。 - asawyer
3
如果某个字符串不属于 {"02", "03", "06", "07"} 中的任何一个,则执行以下操作。 - Victor Zakharov
4个回答

26

是否可以使用Contains方法?

Dim testAgainst As String() = {"02","03","06","07"}
If Not testAgainst.Contains(someString) Then
    btnButton.Enabled = False
End If

1
吹毛求疵:它不是 Array.Contains,而是 IEnumerable(Of String) 的 LINQ 扩展。=) - Ry-
1
如果你在一个紧密循环的代码中使用数组,即使是小数组,也应该使用哈希集合来代替它。这样做可以产生很大的差异。 - Scott Chamberlain
@ScottChamberlain:我只是认为,使用 btnButton.Enabled = False,它不是一个紧密的循环 =) 在这种情况下,从数组构建 HashSet 仍然较慢。但在其他情况下,这是个好观点。 - Ry-
构造函数将是一次性的成本,因为您应该使其静态并且不要在代码中创建它。如果您只进行读操作,则HashSet是线程安全的。 - Scott Chamberlain

15

在简单情况下,你可以滥用 Select 来做到这一点:

Select Case someString
    Case "02", "03", "06", "07"
    Case Else
        btnButton.Enabled = False
End Select

另外,我常用的一个常见扩展是:

<Extension()>
Function [In](Of TItem, TColl)(this As TItem, ParamArray items() As TColl)
    Return Array.IndexOf(items, this) > -1
End Function
所以:
If Not someString.In("02", "03", "06", "07") Then
    btnButton.Enabled = False
End If

4
对于“滥用选择语句的点赞”。尽管有些显而易见,但我之前没有意识到可以将其用于此目的。+1 - Victor Zakharov

5
Dim invalidvalues As New List(Of String) From { _
    "02", _
    "03,", _
    "04", _
    "07" _
}

If invalidvalues.Contains(x) Then
    btnButton.Enabled = False
End If

1
请注意,在VB 2010及更高版本中,您可以通过省略下划线使其看起来更美观。 - Ry-

0

这个怎么样?

Imports System.Text.RegularExpressions    

btnButton.Enabled = Regex.IsMatch(someString, "^0[2367]$")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接