Использование С# для проверки того, содержит ли строка строку в массиве строк
Я хочу использовать С#, чтобы проверить, содержит ли строковое значение слово в массиве строк. Например,
string stringToCheck = "text1text2text3";
string[] stringArray = { "text1", "someothertext", etc... };
if(stringToCheck.contains stringArray) //one of the items?
{
}
Как проверить, содержит ли строковое значение для 'stringToCheck' слово в массиве?
Ответы
Ответ 1
вот как вы можете это сделать:
string stringToCheck = "text1";
string[] stringArray = { "text1", "testtest", "test1test2", "test2text1" };
foreach (string x in stringArray)
{
if (stringToCheck.Contains(x))
{
// Process...
}
}
ОБНОВЛЕНИЕ: Возможно, вы ищете лучшее решение. Обратите внимание на ответ @Anton Gogolev ниже, в котором используется LINQ.
Ответ 2
Вот как:
if(stringArray.Any(stringToCheck.Contains))
/* or a bit longer: (stringArray.Any(s => stringToCheck.Contains(s))) */
Это проверяет, содержит ли stringToCheck
любую подстроку из stringArray
. Если вы хотите убедиться, что он содержит все подстроки, измените Any
на All
:
if(stringArray.All(stringToCheck.Contains))
Ответ 3
Попробуйте следующее:
Не нужно использовать LINQ
if (Array.IndexOf(array, Value) >= 0)
{
//Your stuff goes here
}
Ответ 4
Просто используйте метод linq:
stringArray.Contains(stringToCheck)
Ответ 5
Самый простой и простой способ.
bool bol=Array.Exists(stringarray,E => E == stringtocheck);
Ответ 6
Что-то вроде этого возможно:
string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };
if (Array.Exists<string>(stringArray, (Predicate<string>)delegate(string s) {
return stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1; })) {
Console.WriteLine("Found!");
}
Ответ 7
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };
if (strNamesArray.Any(x => x == strName))
{
// do some action here if true...
}
Ответ 8
Использование Linq и группы методов было бы самым быстрым и более компактным способом для этого.
var arrayA = new[] {"element1", "element2"};
var arrayB = new[] {"element2", "element3"};
if (arrayB.Any(arrayA.Contains)) return true;
Ответ 9
Вы можете определить свои собственные string.ContainsAny()
и string.ContainsAll()
. В качестве бонуса я даже string.Contains()
метод string.Contains()
который позволяет string.Contains()
без string.Contains()
регистра и т.д.
public static class Extensions
{
public static bool Contains(this string source, string value, StringComparison comp)
{
return source.IndexOf(value, comp) > -1;
}
public static bool ContainsAny(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
{
return values.Any(value => source.Contains(value, comp));
}
public static bool ContainsAll(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
{
return values.All(value => source.Contains(value, comp));
}
}
Вы можете проверить их с помощью следующего кода:
public static void TestExtensions()
{
string[] searchTerms = { "FOO", "BAR" };
string[] documents = {
"Hello foo bar",
"Hello foo",
"Hello"
};
foreach (var document in documents)
{
Console.WriteLine("Testing: {0}", document);
Console.WriteLine("ContainsAny: {0}", document.ContainsAny(searchTerms, StringComparison.OrdinalIgnoreCase));
Console.WriteLine("ContainsAll: {0}", document.ContainsAll(searchTerms, StringComparison.OrdinalIgnoreCase));
Console.WriteLine();
}
}
Ответ 10
Try:
String[] val = { "helloword1", "orange", "grape", "pear" };
String sep = "";
string stringToCheck = "word1";
bool match = String.Join(sep,val).Contains(stringToCheck);
bool anothermatch = val.Any(s => s.Contains(stringToCheck));
Ответ 11
Вы также можете сделать то же, что и Антон Гоголев, чтобы проверить, соответствует ли любому элементу в stringArray1
любой элемент в stringArray2
:
if(stringArray1.Any(stringArray2.Contains))
И также все элементы в stringArray1 соответствуют всем элементам в stringArray2:
if(stringArray1.All(stringArray2.Contains))
Ответ 12
Я использую следующее в консольном приложении для проверки аргументов
var sendmail = args.Any( o => o.ToLower() == "/sendmail=true");
Ответ 13
Я бы использовал Linq, но все равно это можно сделать с помощью:
new[] {"text1", "text2", "etc"}.Contains(ItemToFind);
Ответ 14
попробуйте это, вот пример: Чтобы проверить, содержит ли поле какое-либо из слов в массиве. Чтобы проверить, содержит ли поле (someField) какое-либо из слов в массиве.
String[] val = { "helloword1", "orange", "grape", "pear" };
Expression<Func<Item, bool>> someFieldFilter = i => true;
someFieldFilter = i => val.Any(s => i.someField.Contains(s));
Ответ 15
public bool ContainAnyOf(string word, string[] array)
{
for (int i = 0; i < array.Length; i++)
{
if (word.Contains(array[i]))
{
return true;
}
}
return false;
}
Ответ 16
Я использовал аналогичный метод для IndexOf by Maitrey684 и цикл foreach для Theomax, чтобы создать это. (Примечание: первые 3 строки "строка" являются всего лишь примером того, как вы могли бы создать массив и получить его в надлежащем формате).
Если вы хотите сравнить 2 массива, они будут разделены запятыми, но последнее значение не будет иметь после него. Если вы добавляете полуколоду к строковой форме массива (т.е. A; b; c становится a; b; c;), вы можете сопоставить с помощью "x;" независимо от того, в какой позиции он находится:
bool found = false;
string someString = "a-b-c";
string[] arrString = someString.Split('-');
string myStringArray = arrString.ToString() + ";";
foreach (string s in otherArray)
{
if (myStringArray.IndexOf(s + ";") != -1) {
found = true;
break;
}
}
if (found == true) {
// ....
}
Ответ 17
string [] lines = {"text1", "text2", "etc"};
bool bFound = lines.Any(x => x == "Your string to be searched");
bFound устанавливает значение true, если искомая строка сопоставляется с любым элементом массива 'lines'.
Ответ 18
Попробуйте это
string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };
var t = lines.ToList().Find(c => c.Contains(stringToCheck));
Он вернет вам строку с первой встречей текста, который вы ищете.
Ответ 19
Если stringArray
содержит большое количество строк с переменной длиной, рассмотрите возможность использования Trie для хранения и поиска массива строк.
public static class Extensions
{
public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
{
Trie trie = new Trie(stringArray);
for (int i = 0; i < stringToCheck.Length; ++i)
{
if (trie.MatchesPrefix(stringToCheck.Substring(i)))
{
return true;
}
}
return false;
}
}
Вот реализация класса Trie
public class Trie
{
public Trie(IEnumerable<string> words)
{
Root = new Node { Letter = '\0' };
foreach (string word in words)
{
this.Insert(word);
}
}
public bool MatchesPrefix(string sentence)
{
if (sentence == null)
{
return false;
}
Node current = Root;
foreach (char letter in sentence)
{
if (current.Links.ContainsKey(letter))
{
current = current.Links[letter];
if (current.IsWord)
{
return true;
}
}
else
{
return false;
}
}
return false;
}
private void Insert(string word)
{
if (word == null)
{
throw new ArgumentNullException();
}
Node current = Root;
foreach (char letter in word)
{
if (current.Links.ContainsKey(letter))
{
current = current.Links[letter];
}
else
{
Node newNode = new Node { Letter = letter };
current.Links.Add(letter, newNode);
current = newNode;
}
}
current.IsWord = true;
}
private class Node
{
public char Letter;
public SortedList<char, Node> Links = new SortedList<char, Node>();
public bool IsWord;
}
private Node Root;
}
Если все строки в stringArray
имеют одинаковую длину, вам будет лучше использовать только HashSet
вместо Trie
public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
{
int stringLength = stringArray.First().Length;
HashSet<string> stringSet = new HashSet<string>(stringArray);
for (int i = 0; i < stringToCheck.Length - stringLength; ++i)
{
if (stringSet.Contains(stringToCheck.Substring(i, stringLength)))
{
return true;
}
}
return false;
}
Ответ 20
Простое решение, не требуется linq any
String.Join( ",", array).Contains(Value + "," );
Ответ 21
int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);
Ответ 22
Попробуйте, нет необходимости в цикле.
string stringToCheck = "text1";
List<string> stringList = new List<string>() { "text1", "someothertext", "etc.." };
if (stringList.Exists(o => stringToCheck.Contains(o)))
{
}
Ответ 23
Для завершения вышеуказанных ответов, для проверки IgnoreCase используйте:
stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)
Ответ 24
Для моего случая вышеуказанные ответы не сработали. Я проверял строку в массиве и присваивал ей логическое значение. Я изменил ответ @Anton Gogolev и удалил метод Any()
и поместил stringToCheck
в метод Contains()
.
bool = stringArray.Contains(stringToCheck);
Ответ 25
Я использовал следующий код, чтобы проверить, содержит ли строка какой-либо элемент в массиве строк:
foreach (string s in stringArray)
{
if (s != "")
{
if (stringToCheck.Contains(s))
{
Text = "matched";
}
}
}
Ответ 26
Показаны три варианта. Я предпочитаю найти третий как самый краткий.
class Program {
static void Main(string[] args) {
string req = "PUT";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.A"); // IS TRUE
}
req = "XPUT";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.B"); // IS TRUE
}
req = "PUTX";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.C"); // IS TRUE
}
req = "UT";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.D"); // false
}
req = "PU";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("one.1.E"); // false
}
req = "POST";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("two.1.A"); // IS TRUE
}
req = "ASD";
if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
Console.WriteLine("three.1.A"); // false
}
Console.WriteLine("-----");
req = "PUT";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.A"); // IS TRUE
}
req = "XPUT";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.B"); // false
}
req = "PUTX";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.C"); // false
}
req = "UT";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.D"); // false
}
req = "PU";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("one.2.E"); // false
}
req = "POST";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("two.2.A"); // IS TRUE
}
req = "ASD";
if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0) {
Console.WriteLine("three.2.A"); // false
}
Console.WriteLine("-----");
req = "PUT";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.A"); // IS TRUE
}
req = "XPUT";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.B"); // false
}
req = "PUTX";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.C"); // false
}
req = "UT";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.D"); // false
}
req = "PU";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("one.3.E"); // false
}
req = "POST";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("two.3.A"); // IS TRUE
}
req = "ASD";
if ((new string[] {"PUT", "POST"}.Contains(req))) {
Console.WriteLine("three.3.A"); // false
}
Console.ReadKey();
}
}