【问题标题】:VB.NET - Adding more than 1 string to .containsVB.NET - 向 .contains 添加超过 1 个字符串
【发布时间】:2011-01-13 20:07:55
【问题描述】:

我有一个 HTMLElementCollection,我正在使用 For Each 循环查看 InnerHTML 是否包含某些单词。如果它们确实包含这些关键字中的任何一个,则会将其保存到文件中。

一切正常,但我想知道是否有办法简化。这是一个示例

For Each Helement As HtmlElement In elements

     If Helement.InnerHtml.Contains("keyword1") Or Helement.InnerHtml.Contains("keyword2") Or Helement.InnerHtml.Contains("keyword3") Or Helement.InnerHtml.Contains("keyword4") Or Helement.InnerHtml.Contains("keyword5") = True Then
         ' THE CODE TO COPY TO FILE
     End If

Next Helement

是否存在类似的东西:

If Helement.InnerHtml.Contains("keyword1", "keyword2", "keyword3", "keyword4", "keyword5")

我现在这样做的方式似乎很浪费,而且我对此非常有强迫症。

【问题讨论】:

    标签: vb.net contains


    【解决方案1】:

    1) 一种方法是将InnerHtml 字符串与包含关键字的正则表达式相匹配,作为替代列表:

    Imports System.Text.RegularExpressions
    
    Dim keywords As New Regex("keyword1|keyword2|keyword3")
    
    ...
    
    If keywords.IsMatch(HElement.InnerHtml) Then ...
    

    如果您事先知道所有关键字,这应该会很好。

    2) 另一种方法是构建关键字列表,然后将InnerHtml 字符串与列表中的每个元素进行比较:

    Dim keywords = {"keyword1", "keyword2", "keyword3"}
    
    ...
    
    For Each keyword As String In keywords
        If HElement.InnerHtml.Contains(keyword) Then ...
    Next
    

    编辑:Rob 建议的扩展方法将产生比上述方法#2,IMO 更优雅的代码。

    【讨论】:

      【解决方案2】:

      您可以将Extension Method 写入提供多输入选项的字符串,例如:

       Public Module StringExtensionMethods
           Private Sub New()
           End Sub
           <System.Runtime.CompilerServices.Extension> _
           Public Function Contains(ByVal str As String, ByVal ParamArray values As String()) As Boolean
               For Each value In values
                   If str.Contains(value) Then
                       Return True
                   End If
               Next
               Return False
           End Function
       End Module
      

      然后你可以调用它,就像你的第二个例子一样:)

      【讨论】:

      • 请考虑:返回 values.Any(Function(val) str.Contains(val))
      【解决方案3】:

      这是另一种使用 LINQ 稍微清理逻辑的扩展方法:

      <Extension()>
      Public Function MultiContains(str As String, ParamArray values() As String) As Boolean
          Return values.Any(Function(val) str.Contains(val))
      End Function
      

      【讨论】:

        猜你喜欢
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多