3

For Each ループを使用して InnerHTML に特定の単語が含まれているかどうかを確認する HTMLElementCollection があります。これらのキーワードのいずれかが含まれている場合は、ファイルに保存されます。

すべてが正常に機能しますが、単純化する方法があるかどうか疑問に思っていました。これがサンプルです

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です.

4

3 に答える 3

3

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 よりも洗練されたコードになります。

于 2010-02-06T10:02:12.237 に答える
3

次のような複数入力オプションを提供する拡張メソッドを文字列に記述できます。

 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番目の例のように、代わりにそれを呼び出すことができます:)

于 2010-02-06T10:02:36.120 に答える
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
于 2015-02-19T13:28:24.463 に答える