C# StringReader Class

У меня есть эта проблема, я использую StringReader, чтобы найти конкретные слова из текстового поля, до сих пор работает отлично, однако мне нужно найти способ, как проверять конкретные слова в каждой строке по массиву строк.

Следующий код работает:

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++;
        }
    }
}

Теперь я создал String Array для хранения более одной строки, но метод Contains, похоже, принимает только строку.

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

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

У кого-нибудь есть идеи, как это сделать или как это улучшить?

Заранее спасибо.

4 ответа

Решение

Если вы ищете наличие любого из этих слов в строке, попробуйте:

if(systemsarray.Any(word => txt.Contains(word)))
{
    users++;
}

Вам нужно извлечь каждый элемент из вашего массива:

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

Почему бы не написать себе метод расширения для этого?

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    
}

Использование:

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

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

Если вы хотите поиск без учета регистра (as400 будет соответствовать AS400), вы можете сделать это

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

Вы можете удалить StringComparison.OrdinalIgnoreCase, если хотите учесть регистр (или выбрать другое значение перечисления).

Другие вопросы по тегам