6

I have this problem, I'm using StringReader to find specific words from a textbox, so far is working great, however I need to find a way how to check specific words in every line against a string array.

The following code works:

string txt = txtInput.Text;
string user1 = "adam";
int users = 0;
int systems = 0;

using (StringReader reader = new StringReader(txt))
{
    while ((txt = reader.ReadLine()) != null)
    {
        if (txt.Contains(user1))
        {
            users++;
        }
    }
}

Now, I have created a String Array to store more than one string, but the method Contains seems to only accept a string.

string[] systemsarray = new string[] { "as400", "x500", "mainframe" };

if(txt.Contains(systemsarray))
{
    systems++;
}
// error message: cannot convert from string[] to string

Does anyone have an idea how to do this, or a way to improve it?

Thanks in advance.

4 Answers 4

9

If you are looking for the existence of any of those words in the line, try:

if(systemsarray.Any(word => txt.Contains(word)))
{
    users++;
}
Sign up to request clarification or add additional context in comments.

4 Comments

Or simply if (systemsarray.Any(txt.Contains))
Hard to tell for certain what the OP wants, but if they need a count, replace Any with Count and store that in systems.
@Moo-Juice The answer HocsanMoya selected is effectively the same as this one, only unrolled in a loop instead of as a one liner using LINQ.
Hi, I just did, I'm sorry about that.
5

Why not write yourself an extension method to do this?

public static class StringExtensionMethods
{
    public static bool ContainsAny(this string self, params string[] toFind)
    {
        bool found = false;
        foreach(var criteria in toFind)
            {
                if (self.Contains(criteria))
                {
                    found = true;
                    break;
                }
            };

        return found;
    }   // eo ContainsAny    
}

Usage:

string[] systemsarray = new string[] { "as400", "x500", "mainframe" };

if(txt.ContainsAny(systemsarray))
{
    systems++;
}
// error message: cannot convert from string[] to string

Comments

5

you need to extract each item from your array:

foreach (string item in systemsarray)
{
 if(txt.Contains(item))
 {
    systems++;
 }
}

1 Comment

@LuameLudik, sorry to bother again, I was wondering do you know how to get rid of the duplicates? I have tried several things and still not working, I created a new String Array and tried to remove the duplicates... String[] systems2 = new string[] {item}; IEnumerable<String> distinctsystem = systems2.Distinct(); foreach (String theString in distinctsystem) { systems++; }
2

If you want a case-insensitive search (as400 will match AS400), you can do this

if (systemsarray.Any(x => x.Equals(txt, StringComparison.OrdinalIgnoreCase)))
{
    //systemsarray contains txt or TXT or TxT etc...
}

You can remove StringComparison.OrdinalIgnoreCase if you want to take the case into account (or choose a different enum value).

3 Comments

Hi, thanks for your help, something I did was to convert all the text to lower case; like this; string txt = txtInput.Text.ToLower(); but I will take this in consideration, thanks again!
@HocsanMoya - You're welcome. As as side note, converting and checking the lowercase is not recommended. You should usually use the comparison check above or convert it to uppercase instead more info.
Hi! Thanks, in that case, I will follow your advice.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.