Ici, j'ai un exemple simple pour trouver un élément dans une liste de chaînes. Normalement, j'utilise for loop ou un délégué anonyme pour le faire comme ceci:
int GetItemIndex(string search)
{
int found = -1;
if ( _list != null )
{
foreach (string item in _list) // _list is an instance of List<string>
{
found++;
if ( string.Equals(search, item) )
{
break;
}
}
/* use anonymous delegate
string foundItem = _list.Find( delegate(string item) {
found++;
return string.Equals(search, item);
});
*/
}
return found;
}
LINQ est nouveau pour moi. Je suis curieux de savoir si je peux utiliser LINQ pour trouver un élément dans la liste? Comment si possible?
Réponses:
Il y a plusieurs façons (notez que ce n'est pas une liste complète).
1) Single renverra un seul résultat, mais lèvera une exception s'il n'en trouve pas ou plus d'un (qui peut ou non être ce que vous voulez):
Remarque
SingleOrDefault()
se comportera de la même manière, sauf qu'il renverra null pour les types de référence, ou la valeur par défaut pour les types de valeur, au lieu de lever une exception.2) Où retournera tous les articles qui correspondent à vos critères, vous pouvez donc obtenir un IEnumerable avec un élément:
3) First retournera le premier article qui correspond à vos critères:
Remarque
FirstOrDefault()
se comportera de la même manière, sauf qu'il renverra null pour les types de référence, ou la valeur par défaut pour les types de valeur, au lieu de lever une exception.la source
ReadOnlyCollection
ouObservableCollection
?IEnumerable<T>
ouIQueryable<T>
Si vous voulez l'index de l'élément, cela le fera:
Vous ne pouvez pas vous débarrasser de la lambda lors de la première passe.
Notez que cela lancera si l'élément n'existe pas. Cela résout le problème en recourant à des valeurs nulles:
Si vous voulez l'article:
Si vous souhaitez compter le nombre d'articles qui correspondent:
Si vous voulez que tous les éléments correspondent:
Et n'oubliez pas de vérifier la liste pour
null
dans aucun de ces cas.Ou utilisez
(list ?? Enumerable.Empty<string>())
au lieu delist
.Merci à Pavel pour son aide dans les commentaires.
la source
string.Equals
ici - rien de mal à==
. Deuxièmement, je mentionnerais égalementFirstOrDefault
(pour les cas où l'élément pourrait ne pas être là), etSelect
avec l'index pour couvrir le cas où l'index de l'élément est nécessaire (comme c'est le cas dans l'échantillon de la question elle-même).ArgumentNullException
si la source est nulleSi
List<string>
vous n'avez vraiment pas besoin de LINQ, utilisez simplement:Si vous recherchez l'article lui-même, essayez:
la source
_list.Find(search)
pour le second.Voulez-vous l'article dans la liste ou l'article lui-même (supposerait l'article lui-même).
Voici un tas d'options pour vous:
la source
Cette méthode est plus simple et plus sûre
bool insertOrderNew = lOrders.Find(r => r == "1234") == null ? true : false
la source
true : false
ci-dessous devrait fonctionner de la même façonbool insertOrderNew = lOrders.Find(r => r == "1234") == null;
Et alors
IndexOf
?Par exemple
Notez qu'il renvoie -1 si la valeur ne se produit pas dans la liste
la source
J'avais l'habitude d'utiliser un dictionnaire qui est une sorte de liste indexée qui me donnera exactement ce que je veux quand je le veux.
Chaque fois que je souhaite accéder à mes valeurs de marges, par exemple, j'adresse mon dictionnaire:
Ainsi, selon ce que vous faites, un dictionnaire peut être utile.
la source
Voici une façon de réécrire votre méthode pour utiliser LINQ:
Ainsi, l'appeler avec
GetItemIndex("two")
reviendra1
,et
GetItemIndex("notthere")
reviendra-1
.Référence: linqsamples.com
la source
Essayez ce code:
la source
Si nous devons trouver un élément dans la liste, nous pouvons utiliser la méthode
Find
et lesFindAll
extensions, mais il y a une légère différence entre eux. Voici un exemple.la source
Cela vous aidera à obtenir la première valeur ou la valeur par défaut dans votre recherche Linq List
Cette recherche trouvera la première valeur ou la valeur par défaut qu'elle renverra.
la source
Vous souhaitez rechercher un objet dans la liste d'objets.
Cela vous aidera à obtenir la première valeur ou la valeur par défaut dans votre recherche Linq List.
ou
la source
Vous pouvez utiliser FirstOfDefault avec l'extension Where Linq pour obtenir une classe MessageAction à partir de IEnumerable. Reme
var action = Message.Actions.Where (e => e.targetByName == className) .FirstOrDefault ();
où
Liste des actions {get; ensemble; }
la source