177 votes

Vérifier si la liste contient un élément qui contient une chaîne et obtenir cet élément.

En cherchant une réponse à cette question, je suis tombé sur des questions similaires utilisant LINQ, mais je n'ai pas été en mesure de les comprendre pleinement (et donc de les mettre en œuvre), car je ne suis pas familiarisé avec ce système. Ce que je voudrais faire, en gros, c'est ceci :

  1. Vérifie si un élément d'une liste contient une chaîne spécifique.
  2. Si c'est le cas, prenez cet élément.

Honnêtement, je ne sais pas comment je m'y prendrais pour faire ça. Ce que j'ai pu trouver, c'est ceci (qui ne fonctionne pas, bien sûr) :

if (myList.Contains(myString))
    string element = myList.ElementAt(myList.IndexOf(myString));

Je sais pourquoi ça ne marche pas :

  • myList.Contains() ne renvoie pas true car il vérifiera si un élément entier de la liste correspond à la chaîne que j'ai spécifiée.
  • myList.IndexOf() ne trouvera pas d'occurrence, puisque, comme c'est le cas à nouveau, il vérifiera un élément correspondant à la chaîne.

Pourtant, je n'ai aucune idée de la façon de résoudre ce problème, mais je me dis que je vais devoir utiliser LINQ comme suggéré dans des questions similaires à la mienne. Ceci étant dit, si c'est le cas ici, j'aimerais que la personne qui répond m'explique l'utilisation de LINQ dans son exemple (comme je l'ai dit, je ne m'en suis jamais occupé depuis que j'utilise C#). Merci d'avance les gars (et les filles ?).

EDIT : J'ai trouvé une solution ; il suffit de faire une boucle dans la liste, de vérifier si l'élément actuel contient la chaîne de caractères, puis de définir une chaîne de caractères égale à l'élément actuel. Je me demande cependant s'il existe une méthode plus efficace que celle-ci ?

string myString = "bla";
string element = "";

for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Contains(myString))
        element = myList[i];
}

244voto

Dave Bish Points 7943

Vous devriez être en mesure d'utiliser Linq ici :

var matchingvalues = myList
    .Where(stringToCheck => stringToCheck.Contains(myString));

Si vous souhaitez simplement retourner le premier article correspondant :

var match = myList
    .FirstOrDefault(stringToCheck => stringToCheck.Contains(myString));

if(match != null)
    //Do stuff

34voto

userda Points 435

La réponse de base est la suivante : vous devez itérer dans la boucle et vérifier que chaque élément contient la chaîne spécifiée. Donc, disons que le code est :

foreach(string item in myList)
{
    if(item.Contains(myString))
       return item;
}

Le code équivalent, mais laconique, est le suivant :

mylist.Where(x => x.Contains(myString)).FirstOrDefault();

Ici, x est un paramètre qui agit comme "item" dans le code ci-dessus.

13voto

Chris Points 392
string result = myList.FirstOrDefault(x => x == myString)
if(result != null)
{
  //found
}

9voto

McKay Points 7281
for (int i = 0; i < myList.Length; i++)
{
    if (myList[i].Contains(myString)) // (you use the word "contains". either equals or indexof might be appropriate)
    {
        return i;
    }
}

Les boucles à l'ancienne sont presque toujours les plus rapides.

7voto

Si vous voulez une liste de chaînes de caractères contenant votre chaîne :

var newList = myList.Where(x => x.Contains(myString)).ToList();

Une autre option consiste à utiliser Linq FirstOrDefault

var element = myList.Where(x => x.Contains(myString)).FirstOrDefault();

Gardez à l'esprit que Contains est sensible à la casse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X