Использование C # для проверки, содержит ли строка строку в массиве строк


290

Я хочу использовать C #, чтобы проверить, содержит ли строковое значение слово в строковом массиве. Например,

string stringToCheck = "text1text2text3";

string[] stringArray = { "text1", "someothertext", etc... };

if(stringToCheck.contains stringArray) //one of the items?
{

}

Как я могу проверить, содержит ли строковое значение для 'stringToCheck' слово в массиве?


1
В этом блоге рассматриваются многочисленные методы тестирования, если строка содержит строку: blogs.davelozinski.com/curiousconsultant/…
Роберт Харви,

Ответы:


145

вот как вы можете это сделать:

string stringToCheck = "text1";
string[] stringArray = { "text1", "testtest", "test1test2", "test2text1" };
foreach (string x in stringArray)
{
    if (stringToCheck.Contains(x))
    {
        // Process...
    }
}

ОБНОВЛЕНИЕ: Может быть, вы ищете лучшее решение ... обратитесь к ответу @Anton Gogolev ниже, который использует LINQ.


3
Спасибо, я изменил ваш код: if (stringToCheck.Contains (s)), и это сработало.
Theomax

5
Я сделал, если (stringArray.Contains (stringToCheck)), и это прекрасно работает, спасибо.
Тамара JQ

68
Не используйте этот ответ, используйте LINQ вместо этого
AlexC

11
Небольшое примечание для людей, которые не видят метод Contains в строковом массиве: проверьте, есть ли у вас «using System.Linq;» пространство имен в вашем кодовом файле :)
Судханшу Мишра

5
Linq не всегда доступен в устаревшем программном обеспечении.
Уильям Моррисон

843

Вот как:

if(stringArray.Any(stringToCheck.Contains))
/* or a bit longer: (stringArray.Any(s => stringToCheck.Contains(s))) */

Это проверяет, stringToCheckсодержит ли какая-либо из подстрок из stringArray. Если вы хотите убедиться, что он содержит все подстроки, измените Anyна All:

if(stringArray.All(stringToCheck.Contains))

116
Примечание для себя: linq потрясающе, linq потрясающе, linq потрясающе! Должен начать использовать linq.
Фредрик Йоханссон

2
@Spooks Linq To Objects (который используется в проверке строки ответа) можно использовать через LinqBridge в .NET 2.0 albahari.com/nutshell/linqbridge.aspx
Дэвид Реттенбахер

1
Как бы вы сделали это с неизменностью регистра?
Оффлер

14
@Offler Это было быstringArray.Any(s => s.IndexOf(stringToCheck, StringComparison.CurrentCultureIgnoreCase) > -1)
Антон Гоголев

2
как получить, какой элемент в массиве соответствует?
Ибуби

44

Попробуй это:

Нет необходимости использовать LINQ

if (Array.IndexOf(array, Value) >= 0)
{
    //Your stuff goes here
}

Ницца! И какое преимущество может иметь Linq перед Array.IndexOf ??
Heckflosse_230

21
Это не решает вопрос вообще. IndexOf сообщает вам, содержит ли массив точное совпадение для строки, исходный вопрос состоит в том, содержит ли строка одну из массива строк, что легко обрабатывается Linq.
NetMage

Я знаю, что этот комментарий опоздал, но только для тех, кто не знает, строка - это массив символов, поэтому типы строк содержат метод IndexOf ... так что @NetMage - это возможное решение.
Blacky Wolf

3
@Blacky Wolf, ты прочитал вопрос? Array.IndexOf сообщает вам, если массив содержит значение, ОП хотел знать, содержит ли значение какой-либо член массива, в точности противоположность этому ответу. Вы можете использовать String.IndexOf с Linq: stringArray.Any(w => stringToCheck.IndexOf(w) >= 0)но ответ Linq с использованием String.Contains имеет больше смысла, поскольку именно об этом и просят.
NetMage

40

Просто используйте метод linq:

stringArray.Contains(stringToCheck)

4
Обратите внимание, что Contains - это метод расширения, и вам нужно это сделатьusing System.Linq;
isHuman

11
Этот ответ обратен от вопроса.
NetMage

2
Как за этот ответ проголосовали так много раз? Спустя 5 лет после того, как вопрос задан, и решение в основном полностью противоположно тому, что задает вопрос.
Fus Ro Dah

1
может, просто поменять имена переменных, все будет в порядке?
Жан-Франсуа Фабр

8

Самый простой и образцовый способ.

  bool bol=Array.Exists(stringarray,E => E == stringtocheck);

лучше это stringarray.Exists (entity => entity == stringtocheck)
Марсель Грюгер

Я думаю, вы не можете вызвать существующий метод напрямую из строкового массива. Метод Exists можно использовать непосредственно для списка <T>. Поэтому следует использовать статический метод array.exist <T> для строкового массива. Проверка здесь => msdn.microsoft.com/en- us / library / yw84x8be (v = vs.110) .aspx
Jze

6
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };

if (strNamesArray.Any(x => x == strName))
{
   // do some action here if true...
}

2
Я не думаю, что это то, о чем вопрос.
Панг

5

Возможно, что-то вроде этого:

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!");
}

Это лучшее решение, так как это проверка подстроки по словам в списке вместо проверки точного соответствия.
Рой Б

Хороший ответ, но вау, который трудно читать по сравнению с современным C # даже без Linq; Кроме того, String.Containsможет быть лучше, чем String.IndexOfесли вы не хотите игнорировать регистр, так как Microsoft забыла два аргумента, String.Containsвы должны написать свой собственный. Рассмотрим:Array.Exists(stringArray, s => stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1)
NetMage

3

Использование Linq и метода group было бы самым быстрым и более компактным способом сделать это.

var arrayA = new[] {"element1", "element2"};
var arrayB = new[] {"element2", "element3"};
if (arrayB.Any(arrayA.Contains)) return true;

3

Вы можете определить свои собственные string.ContainsAny()и string.ContainsAll()методы. В качестве бонуса я даже добавил 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();
        }
    }

2

Я использую следующее в консольном приложении, чтобы проверить аргументы

var sendmail = args.Any( o => o.ToLower() == "/sendmail=true");

2

Я бы использовал Linq, но это все еще можно сделать через:

new[] {"text1", "text2", "etc"}.Contains(ItemToFind);

1

Пытаться:

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));

1

Вы также можете сделать то же самое, что предлагает Антон Гоголев, чтобы проверить, совпадает ли какой-либо элемент с каким-либо элементом в :stringArray1stringArray2

if(stringArray1.Any(stringArray2.Contains))

И также все элементы в stringArray1 соответствуют всем элементам в stringArray2:

if(stringArray1.All(stringArray2.Contains))


0

попробуйте это, вот пример: проверить, содержит ли поле какое-либо из слов в массиве. Проверить, содержит ли поле (someField) какие-либо слова из массива.

String[] val = { "helloword1", "orange", "grape", "pear" };   

Expression<Func<Item, bool>> someFieldFilter = i => true;

someFieldFilter = i => val.Any(s => i.someField.Contains(s));

0
public bool ContainAnyOf(string word, string[] array) 
    {
        for (int i = 0; i < array.Length; i++)
        {
            if (word.Contains(array[i]))
            {
                return true;
            }
        }
        return false;
    }

0

Для создания этого я использовал метод, аналогичный IndexOf от 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) { 
    // ....
}

0
string [] lines = {"text1", "text2", "etc"};

bool bFound = lines.Any(x => x == "Your string to be searched");

bFound устанавливает значение true, если искомая строка сопоставляется с любым элементом массива 'lines'.


0

Попробуй это

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };

var t = lines.ToList().Find(c => c.Contains(stringToCheck));

Он вернет вам строку с первым появлением текста, который вы ищете.


0

Если 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;
}

0

Простое решение, не требуется linq любой

String.Join (",", массив) .Contains (Значение + ",");


2
Что если одно из значений в массиве содержит ваш разделитель?
Тайлер Бензинг


0

Попробуйте это, нет необходимости в петле ..

string stringToCheck = "text1";
List<string> stringList = new List<string>() { "text1", "someothertext", "etc.." };
if (stringList.Exists(o => stringToCheck.Contains(o)))
{

}

0

Для завершения вышеуказанных ответов, для проверки IgnoreCase используйте:

stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)

Есть ли способ получить индекс совпадения с этим также? Спасибо.
Si8

0

Для моего случая вышеуказанные ответы не сработали. Я проверял строку в массиве и присваивал ей логическое значение. Я изменил ответ @Anton Gogolev, удалил Any()метод и поместил метод stringToCheckвнутрь Contains().

bool = stringArray.Contains(stringToCheck);


-1

Я использовал следующий код, чтобы проверить, содержит ли строка какие-либо элементы в массиве строк:

foreach (string s in stringArray)
{
    if (s != "")
    {
        if (stringToCheck.Contains(s))
        {
            Text = "matched";
        }
    }
}

3
Это устанавливает Text = "matched"столько раз, сколько stringToCheckсодержит подстроки stringArray. Вы можете поставить breakили returnпосле назначения.
Dour High Arch

-1

Три варианта продемонстрированы. Я предпочитаю найти третий как наиболее сжатый.

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();
    }
}

Ваши вторые два варианта даже не делают то же самое в первом.
Кайл Делани
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.