web-dev-qa-db-fra.com

l'expression lambda existe dans la liste

Si je veux filtrer une liste d'objets par rapport à un identifiant spécifique, je peux le faire:

list.Where(r => r.Id == idToCompare);   

Que faire si, au lieu d'un seul idToCompare, j'ai une liste d'identifiants à comparer?

Quelle est la syntaxe pour comparer avec une liste prédéfinie? Quelque chose comme:

int[] listofIds = GetListofIds();

list.Where(r => r.Id "in listofIds");   
30
leora

Si listOfIds est une liste, cela fonctionnera, mais, List.Contains () est une recherche linéaire, donc ce n'est pas très efficace.

Il est préférable de stocker les identifiants que vous souhaitez rechercher dans un conteneur adapté à la recherche, comme Set.

List<int> listOfIds = new List(GetListOfIds());
lists.Where(r=>listOfIds.Contains(r.Id));
55
Alan
var query = list.Where(r => listofIds.Any(id => id == r.Id));

Une autre approche, utile si le tableau listOfIds est grand:

HashSet<int> hash = new HashSet<int>(listofIds);
var query = list.Where(r => hash.Contains(r.Id));
21
Anthony Pegram

Vous pouvez utiliser la méthode d'extension Contains ():

list.Where(r => listofIds.Contains(r.Id))
6
Shirik

Je regarderais l'opérateur Join:

from r in list join i in listofIds on r.Id equals i select r

Je ne sais pas comment cela serait optimisé par rapport aux méthodes Contains, mais au moins cela donne au compilateur une meilleure idée de ce que vous essayez de faire. C'est également plus proche de ce que vous essayez d'atteindre.

Edit: syntaxe de la méthode d'extension pour l'exhaustivité (maintenant que je l'ai compris):

var results = listofIds.Join(list, i => i, r => r.Id, (i, r) => r);
1
TheEvilPenguin