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");
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));
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));
Vous pouvez utiliser la méthode d'extension Contains ():
list.Where(r => listofIds.Contains(r.Id))
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);