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?

Theomax
źródło
1
Ten blog porównuje
Robert Harvey

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.

Abdel Raoof
źródło
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))
Anton Gogolev
źródło
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
}
Maitrey684
źródło
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)
Legolas21
źródło
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);
Jze
źródło
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...
}
Vernie Namca
źródło
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!");
}
Fredrik Johansson
źródło
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;
Jun Zheng
źródło
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();
        }
    }
Kyle Delaney
źródło
2

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

var sendmail = args.Any( o => o.ToLower() == "/sendmail=true");
Bartburkhardt
źródło
2

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

new[] {"text1", "text2", "etc"}.Contains(ItemToFind);
CloudyMarble
źródło
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));
Valko
źródło
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))
Scotty.NET
źródło
1
stringArray.ToList().Contains(stringToCheck)
Christer Carlsson
źródło
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));
Vijay
źródło
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;
    }
nakisa
źródło
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) { 
    // ....
}
vapcguy
źródło
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.

Pabitra Dash
źródło
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.

Fernando Chávez
źródło
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;
}
tbb
źródło
0

Proste rozwiązanie, nie wymaga żadnego linq

String.Join (",", array) .Contains (Value + ",");

użytkownik5789849
źródło
2
Co jeśli jedna z wartości w tablicy zawiera separator?
Tyler Benzing
0
int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);
amit jha
źródło
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)))
{

}
Amjad Abu Saa
źródło
0

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

stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)
Shady Sirhan
źródło
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);
Matthew Miranda
źródło
0

Korzystanie z metod Find lub FindIndex klasy Array :

if(Array.Find(stringArray, stringToCheck.Contains) != null) 
{ 
}
if(Array.FindIndex(stringArray, stringToCheck.Contains) != -1) 
{ 
}
Andrij Tołstoj
źródło
-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";
        }
    }
}
Theomax
źródło
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();
    }
}
Steve
źródło
Dwie drugie opcje nawet nie robią tego samego na pierwszej.
Kyle Delaney,