VB.NET - Добавление более 1 строки в .contains - PullRequest
2 голосов
/ 06 февраля 2010

У меня есть HTMLElementCollection, которую я собираюсь использовать, используя цикл For Each Loop, чтобы увидеть, содержит ли 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")

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

Ответы [ 3 ]

3 голосов
/ 06 февраля 2010

Вы можете записать метод расширения в строку, которая предоставляет опцию множественного ввода, например:

 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

Вместо этого вы можете вызвать это, как во втором примере:)

2 голосов
/ 06 февраля 2010

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

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

0 голосов
/ 19 февраля 2015

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

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