2010-02-06 3 views
2

У меня есть элемент HTMLElementCollection, который я просматриваю с помощью цикла для каждого цикла, чтобы увидеть, содержит ли InnerHTML определенные слова. Если они содержат какое-либо из этих ключевых слов, оно сохраняется в файле.VB.NET - добавление более 1 строки в .contains

Все работает нормально, но мне было интересно, есть ли способ упростить. Вот пример

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") 

То, как я делаю это сейчас только кажется расточительным, и я довольно OCD об этом.

ответ

2

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 

Edit: метод расширения, предложенный Роб приведет к более элегантному коду, чем вышеупомянутый подход №2, ИМО.

3

Вы можете написать 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 

Вы могли бы назвать, что вместо того, чтобы, как в вашем втором примере :)

+1

Рассмотрим вместо этого: Возвращаемые значения.Any (Функция (val) str.Contains (val)) – Luhmann

0

Вот другое расширение метод, который немного очищает логику с помощью LINQ:

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