Mark
Mark

Reputation: 178

How Do You Return True If A String Contains Any Item In An Array Of String With LINQ in VB.NET

I could not find this question on stack overflow but if it is here, please let me know and I will take it down.

Using LINQ in VB.NET, how do you return True if a string contains one of the items in an array of strings?

This is this is the code in multiple lines. How do you do this in one line with LINQ in VB.NET?

Sub Main

    Dim endPointTimeoutText As Array = {"endpoint timeout", "endpoint is not available"}

    Dim strResult As String = "endpoint is not available sample text."
    
    Dim booleanResult As Boolean = False

    For Each item As String In endPointTimeoutText

        If strResult.Contains(item) Then

            booleanResult = True
            Exit For

        End If

    Next
    
    Console.WriteLine(booleanResult) 'Only included this for the example
    
End Sub

The expected result would be 'True' or 'False' depending on if the string (strResult) contained one of the values in the Array Of Strings (endPointTimeoutText)

Upvotes: 0

Views: 304

Answers (2)

Mark
Mark

Reputation: 178

Thank you Caius Jard for your help on this. I am going to post the complete program for what I'm going to use as the answer below.

I needed to use a List instead of an Array so that I could use the 'Any()' method. Thanks again Caius, I really appreciate it!

Sub Main
    
    Dim endPointTimeoutText As String = "endpoint timeout,endpoint is not available"
    
    Dim endPointTimeoutList As New List(Of String)

    Dim strResult As String = "endpoint is not available sample text."
    
    endPointTimeoutList = endPointTimeoutText.Split(",").ToList()

    Dim areAnyStringsPresent As Boolean
    
    areAnyStringsPresent = endPointTimeoutList.Any(Function(itemInEndPointTimeoutList) strResult.Contains(itemInEndPointTimeoutList))
    
    Console.WriteLine(areAnyStringsPresent)
    
    'This code produces the following output:
    
        'True
    
End Sub

Upvotes: 0

Caius Jard
Caius Jard

Reputation: 74730

You turn it around, mentally - don't ask "for this string X, which of these things in this array are in that string", you ask "for this array of strings, which of them are in this one string X":

Dim whichStringsArePresent = endPointTimeoutText.Where(Function(ett) strResult.Contains(ett))

Dim firstImeoutStringFound = endPointTimeoutText.FirstOrDefault(Function(ett) strResult.Contains(ett))

Dim wasATimeout = endPointTimeoutText.Any(Function(ett) strResult.Contains(ett))

etc

By the way it would make your code read more nicely if you make it so that Collections of things have plural names. Consider something more like this:

Dim wasATimeout = endPointTimeoutTexts.Any(Function(ett) strResult.Contains(ett))

It's subtle, but significant in terms of readability

Upvotes: 1

Related Questions