En cherchant une réponse à cette question, j'en ai rencontré des similaires en 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 cela. Ce que je voudrais, en gros, c'est ceci:
- Vérifiez si un élément d'une liste contient une chaîne spécifique.
- Si c'est le cas, récupérez cet élément.
Honnêtement, je ne sais pas comment j'y arriverais. Ce que je peux trouver, c'est ceci (ne fonctionne pas, bien sûr):
if (myList.Contains(myString))
string element = myList.ElementAt(myList.IndexOf(myString));
Je sais pourquoi cela ne fonctionne pas:
myList.Contains()
ne retourne pastrue
, 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, car, comme c'est encore le cas, il recherchera 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 pense que je vais devoir utiliser LINQ comme suggéré dans des questions similaires aux miennes. Cela étant dit, si c'est le cas ici, j'aimerais que le répondant m'explique l'utilisation de LINQ dans son exemple (comme je l'ai dit, je ne me suis pas préoccupé de cela depuis mon temps avec C #). Merci d'avance les gars (et les filles?).
EDIT: J'ai trouvé une solution; bouclez simplement dans la liste, vérifiez si l'élément actuel contient la chaîne, puis définissez une chaîne égale à l'élément actuel. Je me demande, cependant, existe-t-il un moyen plus efficace que cela?
string myString = "bla";
string element = "";
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Contains(myString))
element = myList[i];
}
myString
, dans votre boucle actuelle, vous obtiendrez le dernier élément. Cela dépend de vous si vous voulez trouver le premier ou le dernier, si vous voulez juste trouver le premier, puis rompre la boucle après avoir trouvé l'élément.Réponses:
Vous devriez pouvoir utiliser Linq ici:
Si vous souhaitez simplement retourner le premier article correspondant:
la source
Where
parFirstOrDefault
dans votre deuxième casmyList.FirstOrDefault(stringToCheck => stringToCheck.Contains(myString))
matching
-ce déterminé par le compilateur (var
)? Puisque je sais que ma liste est de typeString
, serait-il sûr de l'utiliserstring matching
dans ce cas?La réponse de base est la suivante: vous devez parcourir la boucle et vérifier que tout élément contient la chaîne spécifiée. Alors, disons que le code est:
Le code équivalent, mais concis, est:
Ici, x est un paramètre qui agit comme "item" dans le code ci-dessus.
la source
la source
Les boucles à l'ancienne sont presque toujours les plus rapides.
la source
Si vous voulez une liste de chaînes contenant votre chaîne:
Une autre option consiste à utiliser Linq FirstOrDefault
Gardez à l'esprit que cette
Contains
méthode est sensible à la casse.la source
Vous pouvez utiliser la
FirstOrDefault
méthode d'extension de Linq :Cela retournera le premier élément qui contient la sous-chaîne
myString
, ounull
si aucun élément de ce type n'est trouvé.Si tout ce dont vous avez besoin est l'index, utilisez la méthode de la
List<T>
classeFindIndex
:Cela retournera l'index du premier élément qui contient la sous-chaîne
myString
, ou-1
si aucun élément de ce type n'est trouvé.la source
Beaucoup de bonnes réponses ici, mais j'en utilise une simple en utilisant Exists , comme ci-dessous:
la source
Vous devriez pouvoir utiliser quelque chose comme ça, cela a bien fonctionné pour moi:
ou quelque chose comme ça, si vous avez besoin de regarder là où cela ne correspond pas.
la source
vous pouvez utiliser
LINQ vous offre des capacités pour «interroger» n'importe quelle collection de données. Vous pouvez utiliser une syntaxe comme une requête de base de données (select, where, etc) sur une collection (ici la collection (liste) de chaînes).
donc vous faites comme "obtenir-moi des éléments de la liste où il satisfait une condition donnée"
à l'intérieur du Où vous utilisez une "expression lambda"
pour dire brièvement l'expression lambda est quelque chose comme (paramètre d'entrée => valeur de retour)
donc pour un paramètre "item", il renvoie "item.Contains (" required string ")". Donc, il retourne true si l'élément contient la chaîne et par conséquent, il est sélectionné dans la liste car il satisfait la condition.
la source
Pour rester simple, utilisez ceci;
Sinon, pour faire cela avec la boucle for, utilisez this;
la source
Je n'ai pas vu d'option booléenne dans d'autres réponses, donc j'espère que le code ci-dessous aidera quelqu'un.
Juste utiliser
Any()
la source
Il est possible de combiner Any, Where, First et FirstOrDefault; ou placez simplement le prédicat dans l'une de ces méthodes en fonction de ce qui est nécessaire.
Vous devriez probablement éviter d'utiliser First à moins que vous ne souhaitiez qu'une exception soit levée lorsqu'aucune correspondance n'est trouvée. FirstOrDefault est généralement la meilleure option tant que vous savez qu'il renverra la valeur par défaut du type si aucune correspondance n'est trouvée (la valeur par défaut de la chaîne est null, int est 0, bool est faux, etc.).
Testez ce code @ https://rextester.com/TXDL57489
la source