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.