Використовуючи 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)) і він працював.
Теомакс

5
Я зробив, якщо (stringArray.Contains (stringToCheck)), і він чудово працює, дякую.
Тамара JQ

68
Не використовуйте цю відповідь, використовуйте натомість LINQ
AlexC

11
Невелика примітка людям, які не бачать метод Містить у масиві рядків: Перевірте, чи є у вас "using System.Linq;" простір імен у вашому кодовому файлі :)
Sudhanshu Mishra

5
Linq не завжди доступний у застарілому програмному забезпеченні.
Вільям Моррісон

842

Ось як:

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

Це перевіряє, чи stringToCheckмістить якийсь із підрядів з stringArray. Якщо ви хочете переконатися, що він містить усі підрядки, змініть Anyна All:

if(stringArray.All(stringToCheck.Contains))

115
Примітка до себе: 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
як отримати, який елемент у масиві збігається?
ibubi

44

Спробуйте це:

Не потрібно використовувати LINQ

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

Приємно! І яку користь може мати Linq над Array.IndexOf ??
Heckflosse_230

21
Це взагалі не вирішує питання. IndexOf повідомляє вам, якщо масив містить точну відповідність для рядка, вихідне питання полягає в тому, якщо рядок містить один з масиву рядків, з яким Linq легко обробляється.
NetMage

Я знаю, що цей коментар пізно, але просто для тих, хто не знає, рядок - це масив символів, тому типи рядків містять метод IndexOf ... так що @NetMage - це можливе рішення.
Блеккі Вовк

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 (object => entitet == stringtocheck)
Марсель Грюгер

Я думаю, що ти не можеш існувати методом безпосередньо з string array.Exists метод може використовувати безпосередньо для списку <T> .Таким чином, слід використовувати статичний метод array.exist <T> для string array.check here => 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; Крім того, Microsoft String.Containsможе бути кращим, ніж String.IndexOfякщо ви не хочете ігнорувати випадок, оскільки Microsoft забув два аргументи String.Contains, які потрібно написати власним. Поміркуйте:Array.Exists(stringArray, s => stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1)
NetMage

3

Використання Linq та групи методів було б найшвидшим та компактним способом цього зробити.

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


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

Ви також можете зробити те ж саме , що і Антон Гоголів пропонує перевірити , якщо який - або пункт в stringArray1відповідає будь-якому елементу в stringArray2:

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 і циклу передбачень Theomax для створення цього. (Примітка: перші 3 "рядкові" рядки - це лише приклад того, як ви могли створити масив і перевести його у належний формат).

Якщо ви хочете порівняти два масиви, вони будуть розділені двокрапкою, але останнє значення після нього не буде. Якщо ви додасте крапку з двокрапкою до рядкової форми масиву (тобто 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, якщо шуканий рядок збігається з будь-яким елементом масиву 'рядки'.


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
int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);

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

-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.