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, если хотите учесть регистр (или выбрать другое значение перечисления).