Utiliser C# pour vérifier si string contient une chaîne dans un tableau de chaînes

Je veux utiliser C# pour vérifier si une valeur de chaîne contient un mot dans un tableau de chaînes. Par exemple,

string stringToCheck = "text1text2text3";

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

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

}

Comment puis-je vérifier si la valeur de chaîne pour 'stringToCheck' contient un mot dans le tableau?

213
demandé sur NetMage 2010-05-26 15:31:03

25 réponses

Voici comment vous pouvez le faire:

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

UPDATE: {[5] } peut-être que vous cherchez une meilleure solution.. reportez-vous à la réponse de @Anton Gogolev ci-dessous qui utilise LINQ.

107
répondu Abdel Raoof 2016-10-08 19:36:45

Voici comment:

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

Vérifie si stringToCheck contient l'une des sous-chaînes de stringArray. Si vous voulez vous assurer qu'il contient toutes les sous-chaînes, changez Any en All:

if(stringArray.All(stringToCheck.Contains))
698
répondu Anton Gogolev 2015-09-21 10:19:30

Essayez ceci:

Pas besoin D'utiliser LINQ

if (Array.IndexOf(array, Value) >= 0)
{
    //Your stuff goes here
}
30
répondu Maitrey684 2013-07-09 09:54:40

Il suffit d'utiliser la méthode linq:

stringArray.Contains(stringToCheck)

(désolé ne peut pas ajouter un commentaire sur les réponses existantes car ma réputation est

26
répondu Legolas21 2015-09-21 10:07:10

Moyen le plus simple et l'échantillon.

  bool bol=Array.Exists(stringarray,E => E == stringtocheck);
7
répondu Jze 2016-11-02 04:01:05

Quelque chose comme ça peut-être:

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!");
}
5
répondu Fredrik Johansson 2010-05-26 11:39:49
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };

if (strNamesArray.Any(x => x == strName))
{
   // do some action here if true...
}
4
répondu Vernie Namca 2016-04-18 09:14:52

Utiliser Linq et method group serait le moyen le plus rapide et le plus compact de le faire.

var arrayA = new[] {"element1", "element2"};
var arrayB = new[] {"element2", "element3"};
if (arrayB.Any(arrayA.Contains)) return true;
3
répondu Jun Zheng 2013-04-11 01:41:35

Essayez:

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
répondu Valko 2013-04-11 01:42:16

Vous pouvez aussi faire la même chose que Anton Gogolev suggère de vérifier si tout élément de dans stringArray1 correspond tout élément de dans stringArray2:

if(stringArray1.Any(stringArray2.Contains))

Et de même tous les éléments dans stringArray1 correspondent tous les éléments dans stringArray2:

if(stringArray1.All(stringArray2.Contains))
1
répondu Scotty.NET 2013-07-19 10:36:40

J'utilise ce qui suit dans une application console pour vérifier les arguments

var sendmail = args.Any( o => o.ToLower() == "/sendmail=true");
1
répondu bartburkhardt 2014-02-03 09:18:18

J'utiliserais Linq mais cela peut toujours être fait à travers:

new[] {"text1", "text2", "etc"}.Contains(ItemToFind);
1
répondu CloudyMarble 2015-10-01 11:29:49

Vous pouvez définir vos propres méthodes string.ContainsAny() et string.ContainsAll(). En prime, j'ai même lancé une méthode string.Contains() qui permet une comparaison insensible à la casse, etc.

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

, Vous pouvez les tester avec le code suivant:

    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();
        }
    }
1
répondu Kyle Delaney 2018-04-04 19:05:43

Essayer, voici l'exemple : Pour vérifier si le champ contient l'un des mots dans le tableau. Pour vérifier si le champ(someField) contient l'un des mots dans le tableau.

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

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

someFieldFilter = i => val.Any(s => i.someField.Contains(s));
0
répondu Vijay 2011-08-31 16:58:36
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
répondu nakisa 2013-10-01 05:31:08

J'ai utilisé une méthode similaire à L'IndexOf de Maitrey684 et à la boucle foreach de Theomax pour créer ceci. (Note: les 3 premières lignes "string" ne sont qu'un exemple de la façon dont vous pouvez créer un tableau et l'obtenir dans le bon format).

Si vous voulez comparer 2 tableaux, ils seront délimités par des points-virgules, Mais la dernière valeur n'en aura pas après. Si vous ajoutez un point-virgule à la forme de chaîne du tableau (c'est-à-dire a;b;C devient A; b; c;), vous pouvez faire correspondre en utilisant "x;" quelle que soit la position est dans:

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
répondu vapcguy 2014-01-04 04:52:46
string [] lines = {"text1", "text2", "etc"};

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

Bfound définit la valeur true si la chaîne recherchée correspond à un élément du tableau 'lines'.

0
répondu Pabitra Dash 2014-12-26 07:13:19

Essayez ceci

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

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

, vous retournez à la ligne avec la première occurrence du texte que vous recherchez.

0
répondu Fernando Chávez 2015-05-22 19:24:58

Si stringArray contient un grand nombre de chaînes de longueur variable, pensez à utiliser un Trie pour stocker et rechercher le tableau de chaînes.

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

Voici L'implémentation de la classe 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;
}

Si toutes les chaînes de stringArray ont la même longueur, il vaut mieux utiliser un HashSet au lieu d'un 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
répondu tcb 2015-10-16 17:44:06

Solution Simple, pas nécessaire de linq tout

Chaîne.Join ( " ,", tableau).Contient(Valeur+",");

0
répondu user5789849 2016-01-14 13:14:53
int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);
0
répondu amit jha 2016-05-25 09:22:08

Essayez ceci, pas besoin d'une boucle..

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

}
0
répondu Amjad Abu Saa 2017-08-29 12:03:19

Pour compléter les réponses ci-dessus, pour IgnoreCase case à utiliser:

stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)
0
répondu Shady Sirhan 2018-09-26 07:01:50

J'ai utilisé le code suivant pour vérifier si la chaîne contenait l'un des éléments du tableau de chaînes:

foreach (string s in stringArray)
{
    if (s != "")
    {
        if (stringToCheck.Contains(s))
        {
            Text = "matched";
        }
    }
}
-1
répondu Theomax 2012-04-04 22:59:32

Trois options démontrées. Je préfère trouver le troisième comme le plus concis.

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();
    }
}
-1
répondu Steve 2017-03-23 13:28:59