Używanie C #, aby sprawdzić, czy ciąg zawiera ciąg w tablicy ciągów


290

Chcę użyć C #, aby sprawdzić, czy wartość ciągu zawiera słowo w tablicy ciągu. Na przykład,

string stringToCheck = "text1text2text3";

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

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

}

Jak mogę sprawdzić, czy wartość ciągu „stringToCheck” zawiera słowo w tablicy?


Odpowiedzi:


145

oto jak możesz to zrobić:

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

AKTUALIZACJA: Być może szukasz lepszego rozwiązania. Zapoznaj się z odpowiedzią @Anton Gogolev poniżej, która korzysta z LINQ.


3
Dzięki, zmodyfikowałem twój kod do: if (stringToCheck.Contains (s)) i zadziałało.
— Theomax

5
Zrobiłem jeśli (stringArray.Contains (stringToCheck)) i działa świetnie, dzięki.
— Tamara JQ,

68
Nie używaj tej odpowiedzi, zamiast tego użyj LINQ
— AlexC

11
Mała uwaga dla osób, które nie widzą metody Contains na tablicy ciągów: Sprawdź, czy masz „using System.Linq;” przestrzeń nazw w twoim pliku kodowym :)
— Sudhanshu Mishra

5
Linq nie zawsze jest dostępny w starszym oprogramowaniu.
— William Morrison,

842

Oto jak:

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

Sprawdza, czy stringToCheckzawiera którykolwiek z podciągów z stringArray. Jeśli chcesz się upewnić, że zawiera wszystkie podciągi, zmień Anyna All:

if(stringArray.All(stringToCheck.Contains))

115
Uwaga do siebie: linq jest niesamowity, linq jest niesamowity, linq jest niesamowity! Muszę zacząć używać linq.
— Fredrik Johansson

2
@Spooks Linq To Objects (który jest wykorzystywany w sprawdzaniu ciągu odpowiedzi) może być używany przez LinqBridge na .NET 2.0 albahari.com/nutshell/linqbridge.aspx
— David Rettenbacher

1
jak byś to zrobił z niezmiennością wielkości liter?
— Offler

14
@Offler To byłobystringArray.Any(s => s.IndexOf(stringToCheck, StringComparison.CurrentCultureIgnoreCase) > -1)
— Anton Gogolev

2
jak uzyskać, który element w tablicy pasuje?
— ibubi

44

Spróbuj tego:

Nie ma potrzeby korzystania z LINQ

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

Miły! I jaką korzyść może mieć Linq nad Array.IndexOf?
— Heckflosse_230,

21
To wcale nie rozwiązuje pytania. IndexOf powie ci, czy tablica zawiera dokładne dopasowanie do łańcucha, oryginalne pytanie brzmi, czy łańcuch zawiera jedną z tablicy łańcuchów, którą Linq łatwo obsługuje.
— NetMage

Wiem, że ten komentarz jest spóźniony, ale dla tych, którzy nie wiedzą, łańcuch znaków jest tablicą znaków, więc typy łańcuchów zawierają metodę IndexOf ... więc @NetMage jest możliwym rozwiązaniem.
— Blacky Wolf,

3
@Blacky Wolf, czytałeś pytanie? Array.IndexOf mówi ci, czy tablica zawiera wartość, OP chciał wiedzieć, czy wartość zawiera którykolwiek element tablicy, dokładnie odwrotnie niż w tej odpowiedzi. Możesz użyć String.IndexOf z Linq: stringArray.Any(w => stringToCheck.IndexOf(w) >= 0)ale odpowiedź Linq przy użyciu String.Contains ma większy sens, ponieważ właśnie o to proszono.
— NetMage

40

Wystarczy użyć metody linq:

stringArray.Contains(stringToCheck)

4
Zauważ, że Contains jest metodą rozszerzenia i musisz to zrobićusing System.Linq;
— isHuman

11
Ta odpowiedź jest wstecz od pytania.
— NetMage

2
Jak wiele razy oceniano tę odpowiedź? 5 lat po tym, jak pytanie zostało zadane, a rozwiązanie jest w zasadzie odwrócone od tego, o co pyta pytanie.
— Fus Ro Dah

1
może po prostu odwróć nazwy zmiennych, czy będzie dobrze?
— Jean-François Fabre

8

Najprostszy i próbny sposób.

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

lepiej jest stringarray.Exists (entity => entity == stringtocheck)
— Marcel Grüger

Myślę, że nie można wywołać metody bezpośrednio z tablicy ciągów. Metoda Exists może być używana bezpośrednio dla listy <T>. Tak więc należy użyć statycznej metody array.exist <T> dla ciągu tablicy. Zaznacz tutaj => 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
Nie sądzę, by o to pytało pytanie.
— Pang

5

Może coś takiego:

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

Jest to lepsze rozwiązanie, ponieważ jest to sprawdzanie podciągów względem słów na liście zamiast sprawdzania dokładnego dopasowania.
— Roy B

Dobra odpowiedź, ale wow, który jest trudny do odczytania w porównaniu do współczesnego C # nawet bez Linq; także String.Containsmoże być lepszy niż String.IndexOfchyba, że ​​chcesz zignorować wielkość liter, ponieważ Microsoft zapomniał o dwóch argumentach, String.Containsktóre musisz napisać własny. Zastanów się:Array.Exists(stringArray, s => stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1)
— NetMage

3

Użycie Linq i grupy metod byłoby najszybszym i bardziej zwartym sposobem na zrobienie tego.

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

3

Możesz zdefiniować własne string.ContainsAny()i string.ContainsAll()metody. Jako bonus wrzuciłem nawet string.Contains()metodę pozwalającą na porównanie bez rozróżniania wielkości liter itp.

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

Możesz je przetestować za pomocą następującego kodu:

    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

Korzystam z poniższych w aplikacji konsoli, aby sprawdzić argumenty

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

2

Chciałbym użyć Linq, ale nadal można to zrobić poprzez:

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

1

Próbować:

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

Można również zrobić to samo, co Anton Gogolev sugeruje, by sprawdzić, czy każdy element w stringArray1dopasowuje dowolny element w stringArray2:

if(stringArray1.Any(stringArray2.Contains))

Podobnie wszystkie elementy w stringArray1 pasują do wszystkich elementów w stringArray2:

if(stringArray1.All(stringArray2.Contains))


0

spróbuj tego, oto przykład: Aby sprawdzić, czy pole zawiera którekolwiek ze słów w tablicy. Aby sprawdzić, czy pole (someField) zawiera którekolwiek ze słów w tablicy.

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

Użyłem podobnej metody do IndexOf autorstwa Maitrey684 i pętli foreach Theomax, aby to stworzyć. (Uwaga: pierwsze 3 linie „string” są tylko przykładem tego, jak można utworzyć tablicę i ustawić ją we właściwym formacie).

Jeśli chcesz porównać 2 tablice, zostaną one rozdzielone średnikami, ale ostatnia wartość nie będzie miała żadnej po niej. Jeśli dodasz średnik do ciągu znaków w tablicy (tj. A; b; c staje się a; b; c;), możesz dopasować za pomocą „x;” bez względu na to, w jakiej pozycji się znajduje:

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 jest ustawiony na true, jeśli szukany ciąg znaków jest dopasowany do dowolnego elementu „linii” tablicy.


0

Spróbuj tego

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

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

Zwróci ci linię z pierwszą częstotliwością szukanego tekstu.


0

Jeśli stringArrayzawiera dużą liczbę łańcuchów o różnej długości, rozważ użycie Trie do przechowywania i przeszukiwania tablicy ciągów.

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

Oto implementacja Trieklasy

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

Jeśli wszystkie ciągi stringArraymają taką samą długość, lepiej będzie użyć po prostu HashSetzamiast aTrie

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

Spróbuj tego, nie potrzebujesz pętli ..

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

}

0

Aby wypełnić powyższe odpowiedzi, w celu sprawdzenia IgnoreCase użyj:

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

Czy jest też jakiś sposób, aby uzyskać indeks tego meczu? Dzięki.
— Si8

0

W moim przypadku powyższe odpowiedzi nie zadziałały. Sprawdzałem ciąg znaków w tablicy i przypisałem go do wartości boolowskiej. Zmodyfikowałem odpowiedź @Anton Gogolev, usunąłem Any()metodę i wstawiłem stringToCheckdo niej Contains()metodę.

bool = stringArray.Contains(stringToCheck);


-1

Użyłem następującego kodu, aby sprawdzić, czy ciąg zawiera którykolwiek z elementów w tablicy ciągów:

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

3
Ustawia Text = "matched"tyle razy, ile stringToCheckzawiera podciągów stringArray. Możesz umieścić zlecenie breaklub returnpo nim.
— Dour High Arch

-1

Wykazano trzy opcje. Wolę znaleźć trzeci jako najbardziej zwięzły.

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

Dwie drugie opcje nawet nie robią tego samego na pierwszej.
— Kyle Delaney,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.