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.

Anders Arpi
  • 8,277
  • 3
  • 33
  • 49

4 Answers4

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++;
}
Reed Copsey
  • 554,122
  • 78
  • 1,158
  • 1,373
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
Anders Arpi
  • 8,277
  • 3
  • 33
  • 49
Moo-Juice
  • 38,257
  • 10
  • 78
  • 128
5

you need to extract each item from your array:

foreach (string item in systemsarray)
{
 if(txt.Contains(item))
 {
    systems++;
 }
}
LjCode
  • 292
  • 2
  • 12
celerno
  • 1,367
  • 11
  • 30
  • @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 distinctsystem = systems2.Distinct(); foreach (String theString in distinctsystem) { systems++; } – Hocsan Moya Sep 23 '13 at 18:34
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).

keyboardP
  • 68,824
  • 13
  • 156
  • 205
  • 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! – Hocsan Moya Aug 05 '13 at 20:34
  • @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](http://stackoverflow.com/questions/234591/upper-vs-lower-case). – keyboardP Aug 05 '13 at 20:40
  • Hi! Thanks, in that case, I will follow your advice. – Hocsan Moya Aug 05 '13 at 20:48