【问题标题】:VB.NET string equals ".abc" or ".xyz" elseVB.NET 字符串等于“.abc”或“.xyz”,否则
【发布时间】:2013-06-24 08:04:59
【问题描述】:

我如何检查其他两个可能的字符串...(参见示例代码)

Imports System.IO
Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Input path.
        Dim p As String = TextBox1.Text
        ' Get extension.
        Dim extension As String = Path.GetExtension(p)

        If extension = ".abc" Or ".xyz" Then
            'nothing
            Label1.Text = "file type suported"
        Else
            Label1.Text = "Unsuported file type"
        End If
    End Sub
End Class

【问题讨论】:

  • extension = ".abc" 或 extension = ".xyz"
  • 你为什么不用开关盒?

标签: .net vb.net string text


【解决方案1】:

只需添加条件:

If extension = ".abc" OrElse extension = ".xyz" Then
    'nothing
        Label1.Text = "file type suported"
Else
    Label1.Text = "Unsuported file type"
End If

我使用了OrElse,因为它仅在第一个条件返回 false 时检查第二个条件。出于同样的原因,您通常应该使用AndAlso 而不是And

考虑这个例子:

Dim extension As String = Nothing
If extension Is Nothing Or extension.ToLower() = ".abc"
' ...

这会引发异常,因为extension 只不过是Or 导致第二个条件被评估。这是安全的:

If extension Is Nothing OrElse extension.ToLower() = ".abc"

Or versus OrElse

另一种方法是使用肯定列表和Enumerable.Contains

Dim allowedExtensions = { ".abc", ".xyz" }
If allowedExtensions.Contains(extension) Then
    ' ...

【讨论】:

    【解决方案2】:

    你也可以把你支持的扩展放在一个字符串中

    Dim ValidExtensions As String = ".abc.xyz"
    

    然后

    If ValidExtensions.Contains(extension) Then
            Label1.Text = "file type suported"
    Else
        Label1.Text = "Unsuported file type"
    End If   
    

    这样,您支持多少扩展或对列表进行什么更改都无关紧要,您只需更改主字符串以使代码正常工作。

    另外,如果您决定让用户更改支持的文件类型,您可以通过编程方式进行更改。

    【讨论】:

      【解决方案3】:

      @Tim Schmelter 已经非常彻底地回答了这个问题,但是:-

      一个简单的替代方法是 Select 语句 - 如果您决定在未来支持某些其他文件类型,这将更容易更新您的代码:

      Dim extension As String = Path.GetExtension(p)
      Select Case extension
      Case ".abc", ".xyz"
          Label1.Text = "file type suported"
      Case Else
          Label1.Text = "unsupported file type"
      End Select
      

      【讨论】:

      • 我什至会将允许的扩展名列表保存在配置文件中(逗号分隔左右),这样您每次添加时都不必重新编译。
      【解决方案4】:

      试试:

      If extension = ".abc" Or extension = ".xyz" Then
      

      【讨论】:

      • 我猜是因为您使用的是Or 而不是OrElse,但不确定。
      【解决方案5】:

      我想你想改变一行:

      If extension = ".abc" Or extension = ".xyz" Then
      

      【讨论】:

      • Orelse 通常是比 Or 更好的选择
      • 相信你 - 我已经很久没有做任何 VB.net 了。重点仍然是缺少变量名。
      • Orelse 转换为 ||在 C# 中。或翻译为|。如果第一部分已经为真,Orelse 会确保不评估第二部分。
      【解决方案6】:

      将所有支持的扩展存储在HashSet<string> 结构中,并使用Contains 方法检查是否支持指定的扩展。

      Imports System.IO
      Public Class Form1
          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
              Dim supportedExtensions As New System.Collections.Generic.HashSet(Of String)
              supportedExtensions.Add(".abc")
              supportedExtensions.Add(".xyz")
      
              ' Input path.
              Dim p As String = TextBox1.Text
              ' Get extension.
              Dim extension As String = Path.GetExtension(p)
      
              If (supportedExtensions.Contains(extension)) Then
                  'nothing
                  Label1.Text = "file type suported"
              Else
                  Label1.Text = "Unsuported file type"
              End If
          End Sub
      End Class
      

      更新:随着支持的扩展数量的增加,扩展支持检查所需的 OR 条件会增加,这会影响代码的易读性和可维护性。因此,这段代码 sn-p 为您提供了更高的可读性。

      【讨论】:

      • 虽然这行得通,但它并没有比使用If a Or b Then 带来任何好处,只是让一个简单的问题过于复杂
      • 我不同意你的看法。语句中包含多个 OR 条件会降低代码的可读性,并且不被视为“干净代码”。如果支持的扩展超过 10 个怎么办?语句中的 10 个 OR 条件是否可读?是否具有高可维护性?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多